Javascript 查询CosmosDb-其中数组包含来自数组的项
我不知道是否有这个词,我猜有,但现在我无法解释它比数组包含来自数组的项更好 这听起来可能很奇怪,但事实上我并不这么认为,我很难弄明白如何在Azure CosmosDB中做到这一点 来吧。我有这样一份文件:Javascript 查询CosmosDb-其中数组包含来自数组的项,javascript,azure,azure-cosmosdb,Javascript,Azure,Azure Cosmosdb,我不知道是否有这个词,我猜有,但现在我无法解释它比数组包含来自数组的项更好 这听起来可能很奇怪,但事实上我并不这么认为,我很难弄明白如何在Azure CosmosDB中做到这一点 来吧。我有这样一份文件: { "id": "2a62fcf4-988f-4ebe-aedc-fb0c664b85d8", "Title": "Seks års fængsel for overgreb", "ZipCodes": [ { "Code": "6500", "
{
"id": "2a62fcf4-988f-4ebe-aedc-fb0c664b85d8",
"Title": "Seks års fængsel for overgreb",
"ZipCodes": [
{
"Code": "6500",
"Name": "Vojens",
"FoundViaTerm": "Vojens"
},
{
"Code": "6400",
"Name": "Sønderborg",
"FoundViaTerm": "Sønderborg"
},
{
"Code": "6700",
"Name": "Esbjerg",
"FoundViaTerm": "Esbjerg"
}
],
"_rid": "k1sVAPf7SQAMAAAAAAAAAA==",
"_self": "dbs/k1sVAA==/colls/k1sVAPf7SQA=/docs/k1sVAPf7SQAMAAAAAAAAAA==/",
"_etag": "\"00001000-0000-0000-0000-5a14898e0000\"",
"_attachments": "attachments/",
"_ts": 1511295374
}
好的,现在我想查询像这样的文档并找到all,其中ZipCodes.Code位于ZipCodes列表中,例如“6500”、“2700”
我很困惑
我找到了这个方法,如果我只带了一个zipcode,它就可以工作了——我的问题是我带了一个列表
希望有人能帮忙,提前谢谢。根据我的经验,数组中的expr\u包含arr\u expr,expr[,bool\u expr]方法不支持列表参数
根据您的情况,我建议您在Cosmos DB中使用
我创建了3个示例文档作为您的描述
[
{
"id": "1",
"zip": [
{
"code": "1111"
},
{
"code": "2222"
}
]
},
{
"id": "2",
"zip": [
{
"code": "2222"
},
{
"code": "3333"
}
]
},
{
"id": "3",
"zip": [
{
"code": "4444"
},
{
"code": "1111"
},
{
"code": "2222"
}
]
}
]
请参考下面的UDF代码片段:
function test(zipcode){
var arrayList = ["1111","2222"]
var ret = false ;
for(var i=0 ;i <zipcode.length;i++){
if(arrayList.indexOf(zipcode[i].code)){
ret= true;
}else{
ret = false;
break;
}
}
return ret;
}
或
除了使用UDF看起来更容易之外,我不会在查询的过滤器中使用UDF,因为它会影响查询的性能。在我的工作环境中,我也遇到了同样的问题,在我的工作环境中,使用UDF来帮助查询,但现实情况是,大多数情况下,我们使用单个值进行查询,而使用UDF实际上会导致查询不使用索引。因此,在这种情况下,如果需要验证数组中的多个值,根据需要验证的值的数量,您可以始终编写类似于array_CONTAINSc、1或array_CONTAINSc、2或….的内容
这个解决方案看起来不那么优雅,但可以确保它使用索引并在查询中发挥最佳性能。您可以执行以下操作: 对于ZipCodes中的每个项目,您都会得到一个zip,并与您正在检查的代码数组进行比较。IMHO,这比使用UDF要好得多 { 查询:' 选择不同的值r 从根r 在r.zipCodes中加入拉链 WHERE数组_CONTAINS@zipIds,zip,真的 ', 参数:[{name:@zipIds,value:zipIds}] }
数组_CONTAINS的最后一个参数告诉函数接受部分匹配 我想为这个问题提出另一个解决方案。使用EXISTS with ARRAY_CONTAINS的方法如下: 从c中选择* 哪里有
在数组_包含[65006700]的c.ZipCodes中,从z中选择值z,z感谢您的回复。我真的不明白这应该如何帮助我,但你让我更多地思考UDF。也许这是我需要进一步研究的解决方案的一部分。好吧,是和否。我还没有时间在代码C中真正实现它,但我已经在数据资源管理器中玩过了,似乎我可以使用多个数组_包含,或者介于两者之间:实际上正如@Amitbe link所建议的那样。在该链接中,还建议使用JOIN,我也将对此进行研究,看看这是否更好。这些UDF——我真的不喜欢。是的,也许我的应用程序有一些完全独特和定制的东西,但实际上,我这里需要的不是那种独特或定制的东西。再加上我真的不喜欢JavaScript。我刚刚尝试过使用它,但对于任何长度大于1的列表,它似乎都会被破坏…@JayGong您提供的UDF链接不再有效:@fascynacja非常感谢您的通知!已经修好了!此查询的可能重复项将具有更好的性能:在r.zipCides中从r中选择r,在@zipIds中从zip中选择值zip
SELECT * FROM c WHERE c.ZipCodes[0].Code IN ("6500", "6700")
SELECT DISTINCT c FROM c JOIN zc IN c.ZipCodes WHERE zc.Code IN ("2720", "2610")