varios update tutorial tipos modificar insertar español embebidos eliminar documentos documento datos campo json node.js mongodb mongoose subdocument

json - update - tipos de datos en mongodb



MongoDB filtra múltiples sub documentos (1)

Tengo un documento estructurado como este en mongo DB, y quiero filtrar para mostrar solo los subdocumentos activos: autos activos y frutas activas.

{ "name":"Andre", "fruits":[ { "active":true, "fruitname":"apple" },{ "active":false, "fruitname":"banana" } ], "cars":[ { "active":false, "carname":"ford" },{ "active":true, "carname":"GM" }, ] }

este es mi resultado deseado

{ "name":"Andre", "fruits":[ { "active":true, "fruitname":"apple" } ], "cars":[ { "active":true, "carname":"GM" }, ] }

Probé Aggregate pero cuando hay autos o frutas activas, no devuelven nada.

m_object.aggregate([ { $match : { "name": "andre" }}, { $unwind : "$fruits" }, { $unwind : "$cars" }, { $match : { ''fruits.active'':{$eq: true} }}, { $match : { ''cars.active'':{$eq: true} }}, { $group : { "name": "$name", cars: { $addToSet : "$cars" } fruits: { $addToSet : "$fruits" } }} ], function (err, result) { if (err) { console.log(err); return; } console.log(''result''); });

¿Hay alguna manera de omitir los subdocumentos "active":false en esos subdocumentos?


Utilice la siguiente canalización de agregación para obtener el resultado deseado:

var pipeline = [ { "$match": { "name": "Andre", "fruits.active": true, "cars.active": true } }, { "$unwind": "$fruits" }, { "$unwind": "$cars" }, { "$match": { "fruits.active": true, "cars.active": true } }, { "$group": { "_id": { "_id": "$_id", "name": "$name" }, "cars": { "$addToSet" : "$cars" }, "fruits": { "$addToSet" : "$fruits" } } }, { "$project": { "_id": 0, "name": "$_id.name", "cars": 1, "fruits": 1 } } ] m_object.aggregate(pipeline) .exec(function (err, result) { if (err) { console.log(err); return; } console.log(''result''); });

O puede usar el generador de canalizaciones de agregación de la siguiente manera:

m_object.aggregate() .match({ "name": "Andre", "fruits.active": true, "cars.active": true }) .unwind("fruits") .unwind("cars") .match({ "fruits.active": true, "cars.active": true }) .group({ "_id": { "_id": "$_id", "name": "$name" }, "cars": { "$addToSet" : "$cars" }, "fruits": { "$addToSet" : "$fruits" } }) .project({ "_id": 0, "name": "$_id.name", "cars": 1, "fruits": 1 }) .exec(callback);