我在 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",
}
]
您可以使用自连接来过滤子查询。然后向
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)
)