Як шукати масив об'єкта в mongodb


207

Припустимо, документом mongodb (таблицею) є "користувачі"

{
  _id: 1,
  name: { first: 'John', last: 'Backus' },
  birth: new Date('Dec 03, 1924'),
  death: new Date('Mar 17, 2007'),
  contribs: [ 'Fortran', 'ALGOL', 'Backus-Naur Form', 'FP' ],
  awards: [
            { award: 'National Medal',
              year: 1975,
              by: 'NSF' },
            { award: 'Turing Award',
              year: 1977,
              by: 'ACM' }
          ]
}
and other object(person)s

Я хочу знайти людину, яка має нагороду "Національна медаль" і яка повинна бути нагороджена в 1975 році. Можуть бути інші особи, які отримали цю нагороду в різні роки.

Як я можу знайти цю людину, використовуючи тип нагороди та рік. Тож я можу знайти точну людину.

Відповіді:


367

Правильний шлях:

db.users.find({awards: {$elemMatch: {award:'National Medal', year:1975}}})

$elemMatch дозволяє зіставити більше одного компонента в межах одного елемента масиву.

Без $elemMatch монго буде шукати користувачів з Національною медаллю через якийсь рік та якусь нагороду в 1975-х, але не для користувачів з Національною медаллю в 1975 році.

Докладнішу інформацію див. У документації MongoDB $ elemMatch . Див. « Прочитати документацію щодо операцій» для отримання додаткової інформації про запити документів з масивами.


4
тобто нагорода матчів «elemMatch» та «рік (на відміну від нагороди» або «рік)
Aditya Mittal

як ми запитуємо лише ті документи, які мають прізвище Іван та нагороджені національною медаллю просто? ми робимо це у сукупності та повторюємо через масив нагород, але хотіли знати простий запит
Venkatesh Kolla - user2742897

23

Використовуйте $ elemMatch для пошуку масиву конкретного об'єкта

db.users.findOne({"_id": id},{awards: {$elemMatch: {award:'Turing Award', year:1977}}})

0

Це можна зробити двома способами:

  1. ElementMatch - $elemMatch(як пояснено у відповідях вище)

    db.users.find ({нагороди: {$ elemMatch: {нагорода: 'Премія Тюрінга', рік: 1977}}})

  2. Використовуйте $andсfind

    db.getCollection ('користувачі'). find ({"$ і": [{"нагород. нагорода": "премія Тьюрінга"}, {"нагород.року": 1977}]}))

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.