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

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

我不确定,但我认为我在 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 以部分匹配字符串。

您可以在数据浏览器的规模和设置部分找到您的索引设置。

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

enter image description here

然后将其更改为:

enter image description here

应该可以。

但是,您可以进一步限制这一点,仅将 /User/Email/? 索引为 Range,并将其余部分保留为哈希。

您还可以通过提供 FeedOptions 对象并将 EnableScanInQuery 值设置为 true 来覆盖此行为。然而,我得到的结果好坏参半,所以我会改变索引。

我强烈建议您查看索引文档 here 。还有一个很棒的视频解释了更多相关内容。

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

相关文章:

c# - 为抽象类中的集合设置值时遇到问题

c# - 如何显示来自两个不同表的日期?

c# - 如何将新项目附加到保存在 C# 文本文件中的 KeyValuePair

c# - 无法让 double.TryParse 在 Linq 表达式树中工作

Azure 队列消息优先级

c# - EntityFramework 6.1.1 与 Linq 性能问题

c# - 此 LINQ to SQL 查询的更完善版本

c# - 为什么 DbSet<t>.Where() 默认使用 IQueryable 版本?

azure - 提供数组作为 devops 管道的参数

azure - 如何将 Azure Blob 的租赁状态更改为可用