我在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",
}
]
型
1条答案
按热度按时间5m1hhzi41#
你可以使用self-join来获得过滤子查询的能力,然后给
ARRAY_CONTAINS
添加一个boolean参数来进行部分匹配,因为您没有在ARRAY_CONTAINS
中指定成员资格的id
。join的副作用是,如果同一个文档有多个匹配项,它会重复结果。在SELECT
:字符串