Vous pouvez suivre la route du cadre d'agrégation, qui a la capacité d'aplatir les tableaux via le $unwind
opérateur. Cela générera un nouvel enregistrement pour chaque élément du champ de données de liste sur lequel le déroulement est appliqué. Il aplatit essentiellement les données.
Après avoir aplati les données, vous auriez besoin du $lookup
opérateur pour faire un "join" sur les products
champ aux products
le recueil. Répétez le processus pour le schéma de fruits imbriqués.
Voyons un exemple (non testé) pour mieux comprendre cela
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);
})
AVIS DE NON-RESPONSABILITÉ : ce qui précède est un code non testé qui ne sert que de guide en faisant quelques hypothèses selon lesquelles vous exécutez le code dans un environnement de test avec les dernières versions de MongoDB et de mongoose qui prennent en charge $lookup
opérateur ET que vous pouvez effectuer la même requête d'agrégation dans mongo shell.