Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 查询CosmosDb-其中数组包含来自数组的项_Javascript_Azure_Azure Cosmosdb - Fatal编程技术网

Javascript 查询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", "

我不知道是否有这个词,我猜有,但现在我无法解释它比数组包含来自数组的项更好

这听起来可能很奇怪,但事实上我并不这么认为,我很难弄明白如何在Azure CosmosDB中做到这一点

来吧。我有这样一份文件:

{
"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")