问题描述
我在查询包含词典的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+值组合。