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

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

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, поэтому не используйте в производственном коде.

  • Нажимайте элементы в массив mongo через mongoose
  • MongoDB / Mongoose запрос в определенную дату?
  • Заseleniumие Mongoose vs вложенность объекта
  • Удаление каскадного стиля в Mongoose
  • толкание объекта в схему массива в Mongoose
  • Гарантирует ли заказ MongoDB $ in
  • Почему вы не можете изменять данные, возвращаемые Mongoose Query (например: findById)
  • Остановить Mongoose от создания свойства _id для элементов массива поддокумента
  • Как вы превращаете документ Mongoose в простой объект?
  • Mongoose: findOneAndUpdate не возвращает обновленный документ
  • MongoDB, удалять объект из массива
  • Interesting Posts

    Free Rest API для получения текущего времени в виде строки (часовой пояс неактуальен)

    Исправить поврежденный загрузчик Windows 7

    Как связать WPF DataGrid с переменным числом столбцов?

    Является MVC в Swing Thread Safe

    Панель навигации Outlook 2010 – отображение непрочитанного числа в почтовом ящике

    Почему строки нельзя изменять в Java и .NET?

    Использует ли Chrome другой DNS-сервер из ОС?

    Как подсчитать количество заданных битов в 32-битовом целое?

    MYSQL Выберите MAX Date внутри оператора объединения

    Получить всех друзей пользователя с помощью API-интерфейса Facebook – Android

    Отключить автоматический подсчет ссылок для некоторых файлов

    Как узнать, какая программа установлена ​​или используется конкретный DLL-файл?

    Как сериализовать словарь как часть его родительского объекта с помощью Json.Net

    “Android.view.WindowManager $ BadTokenException: невозможно добавить окно” на buider.show ()

    Веб-сервис – текущий часовой пояс для города?

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