Cómo buscar en una matriz de objetos en mongodb


207

Supongamos que el documento mongodb (tabla) 'usuarios' es

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

Quiero encontrar a la persona que tiene el premio 'Medalla Nacional' y debe ser galardonado en el año 1975. Podría haber otras personas que tengan este premio en diferentes años.

¿Cómo puedo encontrar a esta persona usando el tipo de premio y el año? Entonces puedo obtener una persona exacta.

Respuestas:


367

La forma correcta es:

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

$elemMatch le permite hacer coincidir más de un componente dentro del mismo elemento de matriz.

Sin $elemMatchmongo buscará usuarios con Medalla Nacional en algún año y algún premio en 1975, pero no usuarios con Medalla Nacional en 1975.

Consulte la documentación de MongoDB $ elemMatch para obtener más información. Consulte Leer documentación de operaciones para obtener más información sobre cómo consultar documentos con matrices.


44
es decir, elemMatch coincide con el premio 'y' año (en oposición al premio 'o' año)
Aditya Mittal

¿Cómo consultamos solo aquellos documentos que tienen el primer nombre como John y se otorgan como medalla nacional de manera simple? lo hacemos con agregada y la iteración a través de premios matriz, pero queríamos saber consulta sencilla
Venkatesh Kolla - user2742897

23

Use $ elemMatch para encontrar la matriz de un objeto en particular

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

0

Puede hacer esto de dos maneras:

  1. ElementMatch - $elemMatch(como se explica en las respuestas anteriores)

    db.users.find ({premios: {$ elemMatch: {premio: 'Premio Turing', año: 1977}}})

  2. Usar $andconfind

    db.getCollection ('usuarios'). find ({"$ y": [{"awards.award": "Premio Turing"}, {"awards.year": 1977}]})

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.