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.

vcxz
fuente

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.

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

Joby Wilson Mathews
fuente