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.

vcxz
la source

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.

Leonid Beschastny
la source
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}}})
KARTHIKEYAN.A
la source
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}]})

Joby Wilson Mathews
la source