我不确定,但是我认为我在Azure Cosmos DB中发现了一个错误。这是我的情况。我有以下JSON
{
"id": "token",
"User": {
"UserToken": "token",
"Email": "email@email.com"
},
"_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
方法存在问题?
答案 0 :(得分:1)
这不是错误。这与您馆藏的索引政策有关。
我不知道您的索引策略当前是什么样的,但是当完全匹配有效且部分匹配不起作用时,可以肯定地说您正在使用Hash
索引您的字符串。
使用哈希时,仅相等检查将返回值。您需要将字符串索引更改为Range
,并将精度-1
更改为部分匹配字符串。
您可以在数据浏览器的Scale & Settings
部分下找到索引设置。
如果您的索引编制策略如下:
然后将其更改为此:
应该工作。
不过,您可以进一步限制它,仅将/User/Email/?
索引为Range
,其余的索引保留为哈希。
您还可以通过提供值为FeedOptions
设置为EnableScanInQuery
的{{1}}对象来覆盖此行为。但是我得到的结果好坏参半,所以我会选择更改索引。
我强烈建议您看一下索引文档here。还有一个精彩的视频对此进行了详细解释。