Estoy tratando de hacer un consultor en mi base de datos MongoDB:
Lo que quiero hacer es obtener algunos datos que están integrados en una matriz anidada y filtrar por una de estas claves anidadas.
El documento es el siguiente:
[ { "name": "PharmaMaria", "country": "Spain", "currency": "EUR", "medicines": [ { "name": "Medicine 1", "type": "Suncream", "price": 32, }, { "name": "Medicine 2", "type": "Suncream", "price": 5 }, { "name": "Medicine 3", "type": "Pills", "price": 7 } ] } ] Y quiero obtener algo como esto filtrando por medicines.type
values = [ { "name": "Medicine 1", "price": 32 }, { "name": "Medicine 2", "price": 5 } ]Aquí está el patio de recreo que creé https://mongoplayground.net/p/_riatO8PKVp
¡Gracias!
Debe agregar una etapa $project o $addFields y usar el operador $filter para aplicar la condición en cada elemento.
db.collection.aggregate([ { "$match": { "country": "Spain", "medicines.type": "Suncream" }, }, { "$addFields": { // <- To add a new key "medicines": { // <- Replacing existing `medicines` key "$filter": { // <- Apply condition on each array elements "input": "$medicines", "as": "elem", "cond": { // <- Applying match condition inside this block "$eq": [ "$$elem.type", "Suncream" ], } } } } }, ]) Para obtener solo claves específicas de la matriz, use $map
db.collection.aggregate([ { "$match": { "country": "Spain", "medicines.type": "Suncream" }, }, { "$addFields": { "medicines": { "$map": { "input": { "$filter": { "input": "$medicines", "as": "elem", "cond": { "$eq": [ "$$elem.type", "Suncream" ], } } }, "as": "med", "in": { "name": "$$med.name", "price": "$$med.price", } }, } } }, ])