查询CosmosDb - 其中数组包含数组中的项目

Mad*_*ann 16 javascript azure azure-cosmosdb

我不知道是否有一个字,猜猜有,但是现在我无法解释它比"数组包含数组中的项目"更好.

这可能听起来很奇怪,但事实上它并非(我认为),而且我很难弄清楚我如何在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
Run Code Online (Sandbox Code Playgroud)

}

好的,现在我想查询这样的文档并找到所有,其中ZipCodes.Code在zipcodes列表中,例如.('6500','2700').

我在这里很难...

我找到了ARRAY_CONTAINS方法并且它有效,如果我只输入一个邮政编码 - 我的问题是我带有一个列表.

希望有人可以提前帮助,谢谢.

Jas*_*aul 12

我想针对这个问题提出另一种解决方案。以这种方式
使用:EXISTSARRAY_CONTAINS

SELECT * FROM c
WHERE EXISTS 
(SELECT VALUE z FROM z in c.ZipCodes WHERE ARRAY_CONTAINS(["6500","6700"], z))
Run Code Online (Sandbox Code Playgroud)


Jay*_*ong 10

根据我的经验,exprARRAY_CONTAINS (arr_expr, expr [, bool_expr])方法中不支持列表参数.

根据你的情况,我建议你在Cosmos DB中使用UDF.

我创建了3个示例文档作为您的描述.

[
  {
    "id": "1",
    "zip": [
      {
        "code": "1111"
      },
      {
        "code": "2222"
      }
    ]
  },
  {
    "id": "2",
    "zip": [
      {
        "code": "2222"
      },
      {
        "code": "3333"
      }
    ]
  },
  {
    "id": "3",
    "zip": [
      {
        "code": "4444"
      },
      {
        "code": "1111"
      },
      {
        "code": "2222"
      }
    ]
  }
]
Run Code Online (Sandbox Code Playgroud)

请参考以下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;
}
Run Code Online (Sandbox Code Playgroud)

您可以选择zip数组(从c中选择c.zip),然后循环结果并使用zip[i]参数在代码中调用上面的UDF .

希望它能帮到你.


仅供参考:

使用Cosmos DB SQL API中的IN运算符查询列表条件中包含的条目.

喜欢

SELECT * FROM c WHERE c.ZipCodes[0].Code IN ("6500", "6700")
Run Code Online (Sandbox Code Playgroud)

要么

SELECT * FROM c JOIN zc IN c.ZipCodes WHERE zc.Code IN ("2720", "2610")
Run Code Online (Sandbox Code Playgroud)

  • 嗯,是和不是。我还没有时间在代码(即 C#)中真正实现它,但我已经在数据资源管理器中玩过了,看来我可以使用多个 ARRAY_CONTAINS 并在两者之间使用 OR :) 实际上正如@Amitbe 链接所建议的那样. 在该链接中,还建议使用 JOIN,我也会研究一下,看看是否更好。这些 UDF - 我真的不喜欢它。是的,也许是为了我的应用程序完全独特和定制的东西,但实际上,我在这里需要的并不是那种独特或定制的东西。再加上我真的不喜欢 JavaScript。 (2认同)

San*_*ojo 5

您可以执行以下操作:对于 ZipCodes 中的每个项目,您获取一个邮政编码并与您正在检查的代码数组进行比较。恕我直言,这比使用 UDF 好得多。

{
  query: '
         SELECT DISTINCT value r
         FROM root r
         JOIN zip IN r.zipCodes
         WHERE ARRAY_CONTAINS(@zipIds, zip, true)
         ',
  parameters: [{name: "@zipIds", value: zipIds}]
}
Run Code Online (Sandbox Code Playgroud)

ARRAY_CONTAINS 的最后一个参数告诉函数接受部分匹配。