我不确定,但我认为我在 Azure Cosmos DB 中发现了一个错误。这是我的情况。我有以下 JSON
{
"id": "token",
"User": {
"UserToken": "token",
"Email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c4a1a9a5ada884a1a9a5ada8eaa7aba9" rel="noreferrer noopener nofollow">[email protected]</a>"
},
"_ts": 1521728825
}
我使用 LINQ 编写了以下查询:
await _dbClient.Where<UserDocument>(_collectionUri,feedOptions,
d => d.User.UserToken == searchString
|| d.User.Email.Contains(searchString))
.OrderByDescending(d => d.Timestamp)
.AsDocumentQuery().ToListAsync())
当我使用 searchString=="token"
运行它时,它将返回一个空列表,因此我决定修改查询:
await _dbClient.Where<UserDocument>(_collectionUri,feedOptions,
d => d.User.UserToken == searchString)
.OrderByDescending(d => d.Timestamp)
.AsDocumentQuery().ToListAsync())
神奇的是它开始工作了。有人可以告诉我我做错了什么吗?或者也许 CosmosDB 中的 CONTAINS
方法存在问题??
最佳答案
这不是一个错误。这与您收藏的索引政策有关。
我不知道您的索引策略当前是什么样的,但是当在字符串上完全匹配有效而部分匹配无效时,可以肯定地说您正在使用哈希
字符串索引。
使用哈希时,只有相等性检查才会返回值。您需要将字符串索引更改为 Range
和精度 -1
以部分匹配字符串。
您可以在数据浏览器的规模和设置
部分找到您的索引设置。
如果您的索引策略如下所示:
然后将其更改为:
应该可以。
但是,您可以进一步限制这一点,仅将 /User/Email/?
索引为 Range
,并将其余部分保留为哈希。
您还可以通过提供 FeedOptions
对象并将 EnableScanInQuery
值设置为 true
来覆盖此行为。然而,我得到的结果好坏参半,所以我会改变索引。
我强烈建议您查看索引文档 here 。还有一个很棒的视频解释了更多相关内容。
关于c# - Azure CosmosDB Contains 方法不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53161259/