我不确定,但是我认为我在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部分下找到索引设置。

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

c# - Azure CosmosDB Contains方法不起作用-LMLPHP

然后将其更改为:

c# - Azure CosmosDB Contains方法不起作用-LMLPHP

应该管用。

但是,您可以限制更多,仅将/User/Email/?索引为Range,其余的保留为哈希。

您还可以通过提供值FeedOptions设置为EnableScanInQuerytrue对象来覆盖此行为。但是我对此有不同的结果,所以我会进行索引更改。

我强烈建议您看一下索引文档here。还有一个很棒的视频,详细介绍了它。

关于c# - Azure CosmosDB Contains方法不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53161259/

10-09 09:07