Azure CosmosDB Contains方法不起作用

时间:2018-11-05 19:52:23

标签: c# linq azure asp.net-core azure-cosmosdb

我不确定,但是我认为我在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方法存在问题?

1 个答案:

答案 0 :(得分:1)

这不是错误。这与您馆藏的索引政策有关。

我不知道您的索引策略当前是什么样的,但是当完全匹配有效且部分匹配不起作用时,可以肯定地说您正在使用Hash索引您的字符串。

使用哈希时,仅相等检查将返回值。您需要将字符串索引更改为Range,并将精度-1更改为部分匹配字符串。

您可以在数据浏览器的Scale & Settings部分下找到索引设置。

如果您的索引编制策略如下:

enter image description here

然后将其更改为此:

enter image description here

应该工作。

不过,您可以进一步限制它,仅将/User/Email/?索引为Range,其余的索引保留为哈希。

您还可以通过提供值为FeedOptions设置为EnableScanInQuery的{​​{1}}对象来覆盖此行为。但是我得到的结果好坏参半,所以我会选择更改索引。

我强烈建议您看一下索引文档here。还有一个精彩的视频对此进行了详细解释。