Puede seguir la ruta del marco de agregación, que tiene la capacidad de aplanar las matrices a través de $unwind
operador. Esto generará un nuevo registro para todos y cada uno de los elementos del campo de datos de la lista sobre los que se aplica el desenredado. Básicamente aplana los datos.
Después de aplanar los datos, necesitaría $lookup
operador para hacer una "unión" en los products
campo a los products
recopilación. Repita el proceso para el esquema de frutas anidadas.
Veamos un ejemplo (no probado) para entender esto mejor
var Schema = require('../model/schema');
Schema.Shop.aggregate([
{ "$unwind": "$products" },
{
"$lookup": {
"from": "products",
"localField": "products",
"foreignField": "_id",
"as": "product"
}
},
{ "$unwind": "$product" },
{ "$unwind": "$product.fruits" },
{
"$lookup": {
"from": "fruits",
"localField": "product.fruits",
"foreignField": "_id",
"as": "fruits"
}
},
{
"$project": {
"nameShop": 1,
"nameProduct": "$product.nameProduct",
"nameFruit": "$fruits.nameFruit",
"price": "$fruits.price",
}
}
]).exec(function (err, result){
if (err) throw err;
console.log(result);
})
DESCARGO DE RESPONSABILIDAD :Lo anterior es un código no probado que solo sirve como guía al hacer un par de suposiciones de que está ejecutando el código en un entorno de prueba con las últimas versiones de MongoDB y mongoose que admiten $lookup
operador Y que puede realizar la misma consulta de agregación en mongo Shell.