Můžete jít cestou agregačního rámce, který má kapacitu zploštit pole prostřednictvím $unwind
operátor. Tím se vygeneruje nový záznam pro každý prvek datového pole seznamu, na který je aplikováno uvolnění. V podstatě zplošťuje data.
Po zploštění dat budete potřebovat $lookup
operátora k provedení "připojení" k products
do pole products
sbírka. Opakujte proces pro schéma vnořených plodů.
Podívejme se na příklad (nevyzkoušeno), abychom to lépe pochopili
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);
})
ODPOVĚDNOST :Výše uvedený kód je netestovaný, který slouží pouze jako vodítko, protože předpokládá, že kód spouštíte v testovacím prostředí s nejnovějšími verzemi MongoDB a mongoose, které podporují $lookup
operátor AND že můžete provést stejný agregační dotaz v mongo shell.