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

Если у меня есть эта схема …

person = { name : String, favoriteFoods : Array } 

… где массив favoriteFoods заполнен строками. Как я могу найти всех людей, которые имеют «суши» в качестве своей любимой еды с использованием мангуста?

Я надеялся на что-то вроде:

 PersonModel.find({ favoriteFoods : { $contains : "sushi" }, function(...) {...}); 

(Я знаю, что в mongodb нет $contains , просто объясняя, что я ожидал найти, прежде чем знать решение)

8 Solutions collect form web for “Найти документ с массивом, который содержит определенное значение”

Поскольку favouriteFoods представляет собой простой массив строк, вы можете просто запросить это поле напрямую:

 PersonModel.find({ favouriteFoods: "sushi" }, ...); 

Но я также рекомендую сделать строковый массив явным в вашей схеме:

 person = { name : String, favouriteFoods : [String] } 

В mongodb нет оператора $contains .

Вы можете использовать ответ от JohnnyHK, поскольку это работает. Ближайшая аналогия с тем, что mongo имеет $in , с использованием этого ваш запрос будет выглядеть так:

 PersonModel.find({ favouriteFoods: { "$in" : ["sushi"]} }, ...); 

Мне кажется, что $all было бы более уместно в этой ситуации. Если вы ищете человека, который находится в суши, вы делаете:

 PersonModel.find({ favoriteFood : { $all : ["sushi"] }, ...}) 

Поскольку вы можете фильтровать больше своего поиска, например:

 PersonModel.find({ favoriteFood : { $all : ["sushi", "bananas"] }, ...}) 

$in похоже на OR и $all like AND. Проверьте это: https://docs.mongodb.com/manual/reference/operator/query/all/

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

 db.collection.find({"keyWithArray":{$elemMatch:{"$in":[null], "$exists":true}}}) 

Этот запрос берется из этого сообщения: массив запросов MongoDb с нулевыми значениями

Это была отличная находка, и она работает намного лучше, чем моя первоначальная и неправильная версия (которая, как оказалось, отлично работает только для массивов с одним элементом):

 .find({ 'MyArrayOfSubDocuments': { $not: { $size: 0 } }, 'MyArrayOfSubDocuments._id': { $exists: false } }) 

Если массив содержит объекты, например, если favouriteFoods – это массив объектов следующего вида:

 { name: 'Sushi', type: 'Japanese' } 

вы можете использовать следующий запрос:

 PersonModel.find({"favouriteFoods.name": "Sushi"}); 

Для Loopback3 все приведенные примеры не работали для меня или так же быстро, как использование REST API. Но это помогло мне выяснить, какой именно ответ мне нужен.

{"where":{"arrayAttribute":{ "all" :[String]}}}

Хотя согласны с find (), наиболее эффективны в вашей работе. Тем не менее существует $ соответствие структуры агрегации, чтобы облегчить запрос большого количества записей и генерировать небольшое количество результатов, которые ценят для вас, особенно для группировки и создания новых файлов.

  PersonModel.aggregate([ { "$match": { $and : [{ 'favouriteFoods' : { $exists: true, $in: [ 'sushi']}}, ........ ] } }, { $project : {"_id": 0, "name" : 1} } ]); 

Я знаю, что эта тема старая, но для будущих людей, которые могут задаться вопросом по тому же вопросу, можно было бы сделать еще одно невероятно неэффективное решение:

 PersonModel.find({$where : 'this.favouriteFoods.indexOf("sushi") != -1'}); 

Это позволяет избежать всех оптимизаций MongoDB, поэтому не используйте в производственном коде.

  • Как я могу запросить различные значения в Mongoose?
  • (узел: 3341) Устаревание Предупреждение: Mongoose: mpromise
  • $ искать несколько уровней без $ unwind?
  • Запрос после заполнения в Mongoose
  • поле мангуста с типом имени
  • Метод Mongoose .find () вызывает зависание запросов
  • Вложенный запрос Mongoose в Model по полю его ссылочной модели
  • Model.find (). ToArray () утверждает, что не имеет метода .toArray ()
  • Найти записи MongoDB, где поле массива не пустое
  • MongoDB / Mongoose запрос в определенную дату?
  • Как вы используете Mongoose без определения схемы?
  • Interesting Posts

    Как мы можем сказать, что Windows остается немой?

    Новая вкладка gnome-terminal в одном и том же пути

    Яркость экрана изменяется в зависимости от содержимого экрана – как отключить его?

    Как сделать резервную копию Windows 8?

    Почему C ++ не поддерживает функции, возвращающие массивы?

    Skype – невозможно получать сообщения группового чата

    Подмножество данных содержит только столбцы, имена которых соответствуют условию

    Инструмент анализа памяти в android?

    Пакетное удаление новой строки в txt-файлах в командной строке Windows (cmd)

    Разрешить другу подключаться через Интернет к серверу Minecraft, который я принимал?

    Что такое алгоритм JVM Scheduling?

    Какова конечная «\ D» в информации об ошибках диска журнала событий Windows?

    Есть ли способ включить более 4 ГБ оперативной памяти в 32-разрядную ОС Windows?

    Как импортировать файлы MOV, закодированные h.264, в Windows Movie Maker?

    Как влияет динамическая переменная на производительность?

    Давайте будем гением компьютера.