ARRAY_CONTAINS запрос с одностроковыми значениями в CosmosDB - PullRequest
0 голосов
/ 07 сентября 2018

Например, допустим, у меня есть документ в БД документов Cosmos, который выглядит примерно так:

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

}

}

Я хочу написать SQL-запрос Cosmos, в котором я могу искать частичные совпадения в myStringArray. Я пытался использовать ARRAY_CONTAINS, но не могу заставить это работать, так как кажется, что он только смотрит на заданные значения в массиве.

Например

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

Работает для полного соответствия.

Примеры поиска частичного совпадения, которые я вижу, это

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

Это, очевидно, не сработает, поскольку у меня есть только отдельные строки в myStringArray.

Я предполагаю, что я мог бы комбинировать STARTSWITH с ARRAY_CONTAINS, или, возможно, применить несколько JOINS, но я застрял и не могу разобраться.

Есть ли какой-нибудь способ в CosmosDb, где я могу найти частичное совпадение для любых значений в "myStringArray"?

Ценю всю помощь, которую я могу получить. Спасибо

1 Ответ

0 голосов
/ 01 февраля 2019

Можете ли вы попробовать этот запрос:

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

Справочник по языку SQL для Azure Cosmos DB - ARRAY_CONTAINS

Логическое выражение в ARRAY_CONTAINS (<arr_expr>, <expr> [, bool_expr]) проверяет объекты, а не подстроки:

Если для него установлено значение «истина», и если указанное значение поиска является объектом, команда проверяет частичное совпадение (объект поиска является подмножеством одного из объектов). Если установлено значение «false», команда проверяет полное совпадение всех объектов в массиве.

В следующем примере показано, как проверить частичное совпадение JSON в массиве с помощью ARRAY_CONTAINS.

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
}]
...