azure Cosmos DB中使用数组的数组查询文档

ni65a41a  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(135)

我在Cosmos DB中的文档具有以下结构:

{
  "id": "pst_bf6i9GM0JTN8W1m66N8F",
  "postTitle": "Post 1",
  "memberships": [
      [
          {
              "chain": 1,
              "contractAddress": "0xcB3165Df24BAe1aB590616DE7a950Dd804f39A3C",
              "id": "mbs_IUTG9kJG84Gv2jr17Y8y"
          },
          {
            "chain": 1,
            "contractAddress": "0x00758fc71Cee3AC591E69fF9010c88782E678De2",
            "id": "mbs_jUTG9kJG83Gv2jr17Y8y"
          }
      ],
      [
          {
              "chain": 80001,
              "contractAddress": "0x358738C2Fa36bbb3e983Dc0CC17798E0ef0653f2",
              "id": "mbs_cUTG9kJGx3Gv2jr17Y8l"
          }
      ]
  ]
}

字符串
memberships属性是一个数组,在应用程序逻辑中表示访问后保护内容的要求(AND/OR)(* 无用给予更多细节 *)。
我想写一个查询,可以提取所有包含contractAddresschain值配对列表的帖子。我怎么做?
我尝试了很多方法,但我唯一能够实现的是创建一个存储过程并使用代码过滤项。
为了更好地解释,我将用伪代码(或者最好是不正确的代码)来编写查询,因为我不知道如何正确地执行它(即使可能):

SELECT c.id FROM c WHERE ARRAY_LENGTH(c.memberships) > 0
AND (ARRAY_CONTAINS(c.memberships, {contractAddress: "0x00758fc71Cee3AC591E69fF9010c88782E678De2", chain: 1}) OR
ARRAY_CONTAINS(c.memberships, {contractAddress: "0x358738C2Fa36bbb3e983Dc0CC17798E0ef0653f2", chain: 80001})


此查询的预期输出是精确提取之前呈现的文档的文档ID:

[
  {
    "id": "pst_bf6i9GM0JTN8W1m66N8F",
  }
]

5m1hhzi4

5m1hhzi41#

你可以使用self-join来获得过滤子查询的能力,然后给ARRAY_CONTAINS添加一个boolean参数来进行部分匹配,因为您没有在ARRAY_CONTAINS中指定成员资格的id。join的副作用是,如果同一个文档有多个匹配项,它会重复结果。在SELECT

SELECT DISTINCT c.id 
FROM c
JOIN m IN c.memberships
WHERE ARRAY_LENGTH(m) > 0
AND (
    ARRAY_CONTAINS(m, {contractAddress: '0x00758fc71Cee3AC591E69fF9010c88782E678De2', chain: 1}, true) 
    OR ARRAY_CONTAINS(m, {contractAddress: '0x358738C2Fa36bbb3e983Dc0CC17798E0ef0653f2', chain: 80001}, true)
)

字符串

相关问题