Você pode seguir a rota da estrutura de agregação, que tem a capacidade de nivelar os arrays por meio do
$unwind
operador. Isso gerará um novo registro para cada elemento do campo de dados da lista no qual o desenrolamento é aplicado. Basicamente, achata os dados. Depois de nivelar os dados, você precisaria do
$lookup
operador para fazer um "join" nos products
campo para os products
coleção. Repita o processo para o esquema de frutas aninhadas. Vamos ver um exemplo (não testado) para entender melhor
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);
})
ISENÇÃO DE RESPONSABILIDADE :O código acima é um código não testado que serve apenas como guia, fazendo algumas suposições de que você está executando o código em um ambiente de teste com as versões mais recentes do MongoDB e do mongoose que suportam o
$lookup
operador E que você pode executar a mesma consulta de agregação no shell do mongo.