Cómo buscar en una matriz de objetos en mongodb

Resuelto vcxz asked hace 11 años • 4 respuestas

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 otorgada 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 utilizando el tipo y año de concesión? Entonces puedo encontrar la persona exacta.

vcxz avatar Dec 26 '12 19:12 vcxz
Aceptado

La forma correcta es:

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

$elemMatchle 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 el año 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 avatar Dec 26 '2012 15:12 Leonid Beschastny

Úselo $elemMatchpara encontrar la matriz de un objeto en particular.

db.users.findOne({"_id": id},{awards: {$elemMatch: {award:'Turing Award', year:1977}}})
KARTHIKEYAN.A avatar Apr 28 '2017 06:04 KARTHIKEYAN.A

como se explica en las respuestas anteriores. Además, para devolver solo un campo de toda la matriz, puede usarlo projectionen buscar. y use$

db.getCollection("sizer").find(
  { awards: { $elemMatch: { award: "National Medal", year: 1975 } } },
  { "awards.$": 1, name: 1 }
);

será de regreso

{
    _id: 1,
    name: {
        first: 'John',
        last: 'Backus'
    },
    awards: [
        {
            award: 'National Medal',
            year: 1975,
            by: 'NSF'
        }
    ]
}
Mohammad Yaser Ahmadi avatar Feb 14 '2021 13:02 Mohammad Yaser Ahmadi

Puede hacer esto de dos maneras:

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

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

  2. Usar $andconfind

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

Joby Wilson Mathews avatar Jun 11 '2020 09:06 Joby Wilson Mathews