[ { "_id": "grandParentId", "types": [ { "_id": "parentId", "files": [ { "url": "1.example.com", "_id": "1childId" }, { "url": "2.example.com", "_id": "2childId" } ] } ] } ] cond: { _id: 2childId }
Rendimiento esperado:
{ "url": "2.example.com", "_id": "2childId" }pregunta 2: ¿es este un buen enfoque o debería usar bucles para obtener el resultado deseado?
usando $unwind y $project agregados
pruébalo en mongoPlayground
db.collection.aggregate([ { "$unwind": "$types" }, { "$unwind": "$types.files" }, { "$match": { "types.files._id": "2childId" } }, { "$project": { "url": "$types.files.url", "_id": "$types.files._id" } } ])Estoy seguro de que hay otras formas, pero puede usar el marco de agregación de mongo:
db.collection.aggregate([ { $match: { "types.files._id": "2childId" } }, { $unwind: "$types" }, { $unwind: "$types.files" }, { $replaceRoot: { newRoot: "$types.files" } }, { $match: { _id: "2childId" } } ]) El primer $match es solo para filtrar documentos que coincidan con su condición. $unwind se usan dos veces para deconstruir las diferentes matrices. $replaceRoot reemplaza el documento de entrada con el documento especificado (en este caso, subdocumento, files ) y el $match final filtra las matrices de files que deconstruimos anteriormente, en función de su condición. El primer $match es solo por razones de rendimiento, puede eliminarlo si lo desea.
Puedes ver cómo funcionan los escenarios en https://mongoplayground.net/p/hoz24xP_BNV
Consulte la documentación del marco de agregación de mongo si desea obtener más información al respecto ( https://docs.mongodb.com/manual/aggregation/ )