当前位置: 首页 > 知识库问答 >
问题:

使用 Azure Cosmos DB 匹配多个值

陈龙野
2023-03-14

我的Cosmos DB中有以下json:

[
    {
        "FirstName": "FirstName",
        "LastName": "LastName",
        "TechnologyRatings": [
            {
                "Technology": {
                    "Name": "C#",
                    "id": "d76d59a7-c9a3-404d-91dd-cf2596ee7501"
                },
                "Rating": 1
            },
            {
                "Technology": {
                    "Name": "SQL",
                    "id": "5686189b-ccfc-41c6-bcdb-b56f80130b45",
                },
                "Rating": 2
            }
        ],
        "id": "7c34718f-ef01-4b40-9a03-f0880f424fd4",
        "ModifiedAt": "2021-05-28T09:55:37.6260562Z",
        "_rid": "GyRkALN-kZcCAAAAAAAAAA==",
        "_self": "dbs/GyRkAA==/colls/GyRkALN-kZc=/docs/GyRkALN-kZcCAAAAAAAAAA==/",
        "_etag": "\"00000000-0000-0000-53a7-9c3d693501d7\"",
        "_attachments": "attachments/",
        "_ts": 1622195737
    }
]

现在我尝试对 Technology.id 和评级应用过滤器。这意味着我想选择所有条目,例如评级为1的C#和评级为2的SQL。

大约

(Technology.id = "d76d59a7-c9a3-404d-91dd-cf2596ee7501" and Rating = 1) OR (Technology.id = "5686189b-ccfc-41c6-bcdb-b56f80130b45" and Rating = 2)

因为技术代表是一个不起作用的数组。

我也玩过ARRAY_CONTAINS,但我没有让它工作。

SELECT VALUE c FROM c JOIN t IN c.TechnologyRatings WHERE ARRAY_CONTAINS([{"id": "d76d59a7-c9a3-404d-91dd-cf2596ee7501", "Rating": 1}, {"id": "5686189b-ccfc-41c6-bcdb-b56f80130b45", "Rating": 2}], {"id": t.Technology.id, "Rating": t.Rating}, true)

如何编写这样的查询?

共有2个答案

滕星纬
2023-03-14

以下是查询:

SELECT VALUE root FROM root JOIN (SELECT VALUE EXISTS(SELECT VALUE tRatings FROM root JOIN tRatings IN root["TechnologyRatings"] 
WHERE ((tRatings["Technology"]["id"] = "5686189b-ccfc-41c6-bcdb-b56f80130b45") OR (tRatings["Technology"]["id"] = "d76d59a7-c9a3-404d-91dd-cf2596ee7501")))) AS found WHERE found

请注意,您必须确保在该查询中包含分区键,以避免查询的额外延迟和成本。

如果分区键是“id”字段,则查询如下所示:

SELECT VALUE root FROM root JOIN (SELECT VALUE EXISTS(SELECT VALUE tRatings FROM root JOIN tRatings IN root["TechnologyRatings"]
WHERE ((tRatings["Technology"]["id"] = "5686189b-ccfc-41c6-bcdb-b56f80130b45") OR (tRatings["Technology"]["id"] = "d76d59a7-c9a3-404d-91dd-cf2596ee7501")))) AS found 
WHERE ((root["id"] = "5686189b-ccfc-41c6-bcdb-b56f80130b45") AND found)
    
牧信厚
2023-03-14

你可以试试这个SQL:

SELECT 
    Distinct VALUE c 
FROM c 
JOIN t IN c.TechnologyRatings
WHERE (t.Technology.id = "d76d59a7-c9a3-404d-91dd-cf2596ee7501" and t.Rating = 1) OR (t.Technology.id = "5686189b-ccfc-41c6-bcdb-b56f80130b45" and t.Rating = 2)

或者

SELECT 
    VALUE c 
FROM c 
WHERE 
    (ARRAY_CONTAINS(c.TechnologyRatings,{"Technology": {"id":"d76d59a7-c9a3-404d-91dd-cf2596ee7501"}},true) and ARRAY_CONTAINS(c.TechnologyRatings,{"Rating":1},true))
OR
    (ARRAY_CONTAINS(c.TechnologyRatings,{"Technology": {"id":"5686189b-ccfc-41c6-bcdb-b56f80130b45"}},true) and ARRAY_CONTAINS(c.TechnologyRatings,{"Rating":2},true))
 类似资料:
  • 问题内容: 我正在使用语句,以便将输入插入到SQL Server数据库表中。如何在块中执行多个条件。请参考下面的代码。 当前,它仅执行此行。如何执行条件中的所有3行()。 前任 : 这就是我的期望。我只想更新旧字段()并将记录插入同一张表。我不能用逗号分隔这些语句。SQL发出 语法错误 谢谢你。 问题答案: 您可以使用 它来实现: 请记住,此方法有一些局限性,更多信息: MS Connect

  • 尝试使用FTL模板进行转换时出现异常!freemarker.core.nonNumericalException:对于“-”左手操作数:需要一个数字,但它的计算结果是序列+散列(包装器:f.e.dom.nodelistmodel):==>item.target[在模板“marketing/widgets/freemarker/newblogpost-update.ftl”中,第31行,第105列]

  • 如何精确匹配img标记的多个实例?我读了一些关于preg_match的教程,但从未真正理解。 我以此为基础: 我做了一个小的像正则表达式: 在这之后,我就卡住了。我如何继续匹配所有直到两个字符串的末尾? 我在PHP网站上发现了数组部分: 使用我的代码,我如何获得图像URL和alt标签? 谢谢

  • 是否可以让Selenium匹配多个类名? 例如: 谢谢

  • 我正在通过drools-guvnor创建规则。我已经导入了我的POJO模型,并且一切都设置正确(我已经进行了测试),但我似乎无法弄清楚如何让“匹配”运算符正确工作。这是我到目前为止所拥有的(源代码): 有谁能给我一些关于在drools guvnor中使用多个正则表达式检查的提示,或者一些让它工作的方法。他们的论坛似乎真的很陈腐。我在网上找到的大多数答案都没有答案。 任何帮助都将不胜感激。

  • 我正在搜索一个正则表达式来匹配文本中的所有C#方法,每个找到的方法(引用为“内容”)的主体应该可以通过组访问。 如果文本中只存在一种方法,则上面的C#Regex只能给出所需的结果。 原文: 正则表达式: 如果source中只包含method1,那么它可以完美地工作,但是使用其他method2时,只有一个匹配项,并且不能再提取单独的方法体对。 如何修改正则表达式以匹配多种方法?