Du kan gå vägen för aggregeringsramverket, som har kapacitet att platta till arrayerna genom $unwind
operatör. Detta kommer att generera en ny post för varje element i listdatafältet som avveckling tillämpas på. Det plattar i princip ut data.
Efter att ha plattat ut data skulle du behöva $lookup
operatör för att göra en "join" på products
fältet till products
samling. Upprepa processen för schemat för kapslade frukter.
Låt oss se ett exempel (otestat) för att förstå detta bättre
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);
})
ANSVARSFRISKRIVNING :Ovanstående är oprövad kod som endast fungerar som vägledning genom att göra ett par antaganden om att du kör koden i en testmiljö med de senaste MongoDB- och mongoose-versionerna som stöder $lookup
operator OCH att du kan utföra samma aggregeringsfråga i mongo shell.