Массив json Cosmos DB, который соответствует всем словам

#azure #azure-cosmosdb #azure-cosmosdb-sqlapi

#azure #azure-cosmosdb #azure-cosmosdb-sqlapi

Вопрос:

Мне нужен запрос, который может получить мне документ из списка слов, например, если я использую

 
    select c from c join (SELECT distinct VALUE c.id FROM c JOIN word IN c.words WHERE  word in('word1',word2) and tag in('motorcycle')) ORDER BY c._ts desc

 

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

Документ 1

  "c": {
            "id": "d0f1723c-0a55-454a-9cf8-3884f2d8d61a",
            "words": [
                "word1",
                "word2",
                "word3",
             ]}
 

Документ 2

  "c": {
            "id": "d0f1723c-0a55-454a-9cf8-3884f2d8d61a",
            "words": [
                "word1",
                "word4",
                "word5",
             ]}
 

Ответ №1:

Вы должны быть в состоянии покрыть это двумя ARRAY_CONTAINS выражениями в вашем WHERE предложении (и нет необходимости в a JOIN ):

 SELECT c.id FROM c
WHERE ARRAY_CONTAINS(c.words, 'word1')
AND ARRAY_CONTAINS(c.words, 'word2')
 

Это должно вернуть идентификатор вашего первого документа.

Комментарии:

1. это сработало, но есть ли какой-либо другой способ использовать предложение IN?

2. В вашем случае вы пытаетесь включить два определенных элемента (то есть два разных совпадения). Не существует версии «сопоставить все» ARRAY_CONTAINS() , поэтому я не могу представить, как вы могли бы сделать это по-другому в рамках одного запроса. И вы можете изучить стоимость RU. Когда я запускал это в целях тестирования для вас, оно было меньше 6 RU (правда, у меня было только два документа, но дело в том, что … это не очень дорогой запрос).