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

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

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.js instance.save () callback не срабатывает
  • Невозможно перезаписать модель после компиляции Mongoose
  • поле мангуста с типом имени
  • Вложенный запрос Mongoose в Model по полю его ссылочной модели
  • Model.find (). ToArray () утверждает, что не имеет метода .toArray ()
  • Загрузка изображений с использованием Node.js, Express и Mongoose
  • Необязательные параметры поискового запроса Mongoose?
  • Запрос Mongoose / mongoDB ... но я пришел из sql-фона
  • Mongoose всегда возвращает пустой массив NodeJS
  • Как вернуть результаты Mongoose из метода поиска?
  • Преобразование документов Mongoose в json
  • Interesting Posts

    Как установить разрешения по умолчанию для автомонтированных дисков FAT в Ubuntu 9.10?

    WPF VirtualizingStackPanel для повышения производительности

    Как запустить командный файл в PuTTY с помощью автоматического входа в командной строке?

    Как я могу получить размер папки на SD-карте в Android?

    Временное изменение свойств консоли в Windows 7

    Каково использование faces-config.xml в JSF 2?

    Почему Guid.ToByteArray () упорядочивает байты так, как он делает?

    java.lang.NoClassDefFoundError: javax.activation.DataHandler в android

    Удаление тени из окон в Windows 7

    Как продвигать определенный номер сборки с другой работы в Дженкинсе?

    Один клик, чтобы принять приглашение на встречу в Outlook 2010

    Как printf и co различают float и double

    Экспорт массива в сценарий bash

    Как фильтровать данные в адаптере области?

    была предпринята попытка получить доступ к сокету таким образом, чтобы запретить его разрешения доступа. Зачем?

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