我不确定,但是我认为我在Azure Cosmos DB中发现了一个错误。这是我的情况。我有以下JSON
{
"id": "token",
"User": {
"UserToken": "token",
"Email": "[email protected]"
},
"_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())
神奇地,它开始工作了。有人可以告诉我我在做什么错吗?或maby CosmosDB中的
CONTAINS
方法存在问题? 最佳答案
这不是错误。它与您馆藏的索引政策有关。
我不知道您的索引策略当前是什么样的,但是当一个字符串完全匹配且部分匹配不起作用时,可以肯定地说您正在为字符串使用Hash
索引。
使用哈希时,仅相等检查将返回值。您将需要将字符串索引更改为Range
和精度-1
以部分匹配字符串。
您可以在“数据资源管理器”的Scale & Settings
部分下找到索引设置。
如果您的索引编制策略如下所示:
然后将其更改为:
应该管用。
但是,您可以限制更多,仅将/User/Email/?
索引为Range
,其余的保留为哈希。
您还可以通过提供值FeedOptions
设置为EnableScanInQuery
的true
对象来覆盖此行为。但是我对此有不同的结果,所以我会进行索引更改。
我强烈建议您看一下索引文档here。还有一个很棒的视频,详细介绍了它。
关于c# - Azure CosmosDB Contains方法不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53161259/