Comment rechercher dans un tableau d'objets dans mongodb


207

Supposons que le document mongodb (table) 'users' soit

{
  _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

Je veux trouver la personne qui a le prix «Médaille nationale» et doit être décerné en 1975. Il pourrait y avoir d'autres personnes qui ont ce prix dans différentes années.

Comment puis-je trouver cette personne en utilisant le type de récompense et l'année. Je peux donc obtenir la personne exacte.

Réponses:


367

La bonne façon est:

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

$elemMatch vous permet de faire correspondre plusieurs composants au sein d'un même élément de tableau.

Sans $elemMatchmongo cherchera des utilisateurs avec une médaille nationale dans une année et un prix dans les années 1975, mais pas pour des utilisateurs avec une médaille nationale en 1975.

Voir la documentation de MongoDB $ elemMatch pour plus d'informations. Voir Lire la documentation des opérations pour plus d'informations sur l'interrogation de documents avec des tableaux.


4
ie elemMatch correspond à la récompense 'et' l'année (par opposition à la récompense 'ou' l'année)
Aditya Mittal

Comment interroger uniquement les documents dont le prénom est John et décerner la médaille nationale de manière simple? nous le faisons avec un agrégat et une itération à travers le tableau des récompenses, mais nous voulions connaître une requête simple
Venkatesh Kolla - user2742897

23

Utilisez $ elemMatch pour trouver le tableau d'un objet particulier

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

0

Peut le faire de deux manières:

  1. ElementMatch - $elemMatch(comme expliqué dans les réponses ci-dessus)

    db.users.find ({awards: {$ elemMatch: {award: 'Turing Award', année: 1977}}})

  2. Utiliser $andavecfind

    db.getCollection ('users'). find ({"$ and": [{"awards.award": "Turing Award"}, {"awards.year": 1977}]})

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.