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

问题描述 投票:0回答:1

我在 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)(无法提供更多详细信息)。

我想编写一个查询,可以提取包含

contractAddress
chain
值配对列表的所有帖子。 我该怎么做?

我尝试了很多方法,但我唯一能够实现的方法是创建一个存储过程并使用代码过滤项目。

为了更好地解释,我将用 伪代码(或者最好是不正确的代码)编写查询,因为我不知道如何正确执行(即使可能):

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",
  }
]
azure azure-cosmosdb azure-cosmosdb-sqlapi
1个回答
0
投票

您可以使用自连接来过滤子查询。然后向

ARRAY_CONTAINS
添加一个布尔参数以进行部分匹配,因为您没有在
id
内指定成员资格的
ARRAY_CONTAINS
。自连接会产生副作用,如果同一文档有多个匹配项,它会重复结果。这可以通过
DISTINCT
中的
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)
)
© www.soinside.com 2019 - 2024. All rights reserved.