как найти документы со всеми элементами массива в документе?

#node.js #mongodb #mongoose

Вопрос:

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

Документ

 [
{
...
id:1
tags:['a', 'b', 'c']
...
},
{
...
id:2
tags:['b', 'c']
...
},
{
...
id:3
tags:['d']
...
}
]
 

findone({tags:{$all:['a', 'b']}}) -> 1, потому что a и b указаны только в документе doc 1
findone({tags:{$all:['b']}}) -> 1, 2, потому что b указаны только в документе doc 2
findone({tags:{$all:['a', 'b', 'd']}}) -> ничего, потому что любой документ имеет все теги внутри массива
findone({tags:{$all:['d']}}) -> 3, потому что d есть только в документе 3

Есть ли какой-либо способ сделать этот запрос?

Спасибо

Ответ №1:

Запрос

  • Вы можете использовать $setDifference
  • если пусто (установите различие your_array «$tags») => теги содержат все элементы, а фильтр имеет значение true

Тестовый код здесь

 aggregate(
[{"$match": 
    {"$expr": 
      {"$eq": [{"$setDifference": [["a", "b", "d"], "$tags"]}, []]}}}])