单据包含字典时查询CosmosDB

人气:1,040 发布:2022-10-16 标签: azure azure-cosmosdb azure-cosmosdb-sqlapi

问题描述

我在查询包含词典的CosmosDB文档时遇到问题。这是一个示例文档:

{
    "siteAndDevices": {
        "4cf0af44-6233-402a-b33a-e7e35dbbee6a": [
            "f32d80d9-e93a-687e-97f5-676516649420",
            "6a5eb9fa-c961-93a5-38cc-ecd74ada13ac",
            "c90e9986-5aea-b552-e532-cd64a250ad10",
            "7d4bfdca-547a-949b-ccb3-bbf0d6e5d727",
            "fba51bfe-6a5e-7f25-e58a-7b0ced59b5d8",
            "f2caac36-3590-020f-ebb7-5ccd04b4412c",
            "1b446af7-ba74-3564-7237-05024c816a02",
            "7ef3d931-131e-a639-10d4-f4dd5db834ca"
        ]
    },
    "id": "f9ef9fb6-4b70-7d3f-2bc8-c3d335018624"
}

我需要获取列表中提供的GUID所在的所有文档,因此在字典值中(我不知道字典键)。我在这里的某个地方发现了一个信息,它不可能在CosmosDB的字典中遍历键(可能从那时起它已经改变了,但我在文档中找不到任何信息),但也许有人会有一些想法。我无法更改文档的格式。

我尝试在Linq中执行此操作,但未获得任何结果。

var query = _documentClient
                .CreateDocumentQuery<Dto>(DocumentCollectionUri())
                .Where(d => d.SiteAndDevices.Any(x => x.Value.Contains("f32d80d9-e93a-687e-97f5-676516649420")))
                .AsDocumentQuery();

推荐答案

不确定LINQ查询,但使用SQL时,您需要如下内容:

SELECT * FROM c
where array_contains(c.siteAndDevices['4cf0af44-6233-402a-b33a-e7e35dbbee6a'],"f32d80d9-e93a-687e-97f5-676516649420")

这是一种奇怪的文档格式,因为您已使用ID:

命名了密钥
"siteAndDevices": {
     "4cf0af44-6233-402a-b33a-e7e35dbbee6a": ["..."]
}

您的键是"4cf0af44-6233-402a-b33a-e7e35dbbee6a",这迫使您使用不同的语法来引用它:

c.siteAndDevices['4cf0af44-6233-402a-b33a-e7e35dbbee6a']

您可以省去很多麻烦,将其重构为类似于:

{
   "id": "dictionary1",
   "siteAndDevices": {
      "deviceId": "4cf0af44-6233-402a-b33a-e7e35dbbee6a",
      "deviceValues": ["..."]
   }
}

您可以进一步重构,例如使用数组包含多个设备ID+值组合。

413