Cómo buscar en una matriz de objetos en mongodb
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.
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 $elemMatch
mongo 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.
Úselo $elemMatch
para encontrar la matriz de un objeto en particular.
db.users.findOne({"_id": id},{awards: {$elemMatch: {award:'Turing Award', year:1977}}})
como se explica en las respuestas anteriores. Además, para devolver solo un campo de toda la matriz, puede usarlo projection
en 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'
}
]
}
Puede hacer esto de dos maneras:
ElementMatch -
$elemMatch
(como se explica en las respuestas anteriores)db.users.find({ awards: { $elemMatch: {award:'Turing Award', year:1977} } })
Usar
$and
confind
db.getCollection('users').find({"$and":[{"awards.award":"Turing Award"},{"awards.year":1977}]})