首页 > 解决方案 > 在 CosmosDB 中使用单个字符串值进行 ARRAY_CONTAINS 查询

问题描述

例如,假设我在 Cosmos 文档 DB 中有一个文档,看起来像这样:

  {
"somename" : "myname"
"data": {
    "meta": {
        "versionId": "1",
        "lastUpdated": "somedate",
        "myStringArray": [
            "OneString",
            "AnotherString"
        ]
    }

}

}

我想编写一个 Cosmos SQL 查询,我可以在其中搜索“myStringArray”中的部分匹配项。我一直在尝试使用 ARRAY_CONTAINS 但无法使其正常工作,因为它似乎只查看数组中的给定值。

例如

ARRAY_CONTAINS(data.meta.myStringArray, 'OneString')

适用于全场比赛。

我看到的搜索部分匹配的例子是

ARRAY_CONTAINS(data.meta.myStringArray, {'TheValueIDontHave' : 'OneStrin'}, true)

这显然行不通,因为我在“myStringArray”中只有单个字符串。

我猜我可能能够将 STARTSWITH 与 ARRAY_CONTAINS 结合起来,或者可能应用一些 JOINS,但我卡住了,无法解决。

在 CosmosDb 中是否有任何方法可以搜索“myStringArray”中任何值的部分匹配?

感谢我能得到的所有帮助。谢谢

标签: azure-cosmosdb-sqlapi

解决方案


你能试试这个查询吗:

SELECT VALUE c FROM c JOIN s in c.data.meta.myStringArray WHERE CONTAINS(s, "OneStrin")

Azure Cosmos DB 的 SQL 语言参考 - ARRAY_CONTAINS

ARRAY_CONTAINS (<arr_expr>, <expr> [, bool_expr])检查对象而不是子字符串的布尔表达式:

如果它设置为“true”并且指定的搜索值是一个对象,则该命令会检查部分匹配(搜索对象是其中一个对象的子集)。如果设置为“false”,则该命令会检查数组中所有对象的完全匹配。

以下示例如何使用 ARRAY_CONTAINS 检查数组中 JSON 的部分匹配。

SELECT  
ARRAY_CONTAINS([{"name": "apples", "fresh": true}, {"name": "strawberries", "fresh": true}], {"name": "apples"}, true), 
ARRAY_CONTAINS([{"name": "apples", "fresh": true}, {"name": "strawberries", "fresh": true}], {"name": "apples"}),
ARRAY_CONTAINS([{"name": "apples", "fresh": true}, {"name": "strawberries", "fresh": true}], {"name": "mangoes"}, true)

这是结果集。

[{ 
"$1": true,
"$2": false,
"$3": false
}]

推荐阅读