首页 > 解决方案 > 如何在 MongoDB 中填充嵌套的引用数组?

问题描述

我在“mealPlans”MongoDB 集合中有以下文档:

{
    "_id" : ObjectId("5f4e1c7471b52b63b1ff3c25"),
    "name" : "My Meal Plan",
    "meals" : [ 
        {
            "name" : "Breakfast",
            "foods" : [ 
                {
                    "servingSize" : 100,
                    "food" : ObjectId("5f4a5b3486b27b159befb995")
                }, 
                {
                    "servingSize" : 50,
                    "food" : ObjectId("5f4a5b3486b27b159befb996")
                }
            ]
        }, 
        {
            "name" : "Lunch",
            "foods" : [ 
                {
                    "servingSize" : 100,
                    "food" : ObjectId("5f4a5b3486b27b159befb995")
                }
            ]
        }
    ]
}

还有另一个集合“食物”,其中包含每种食物的营养信息,例如:

{
    "_id" : ObjectId("5f4a5b3486b27b159befb995"),
    "name" : "Fenway franks",
    "carbohydrate" : 4,
    "calories" : 280,
    "measurementUnit" : "g",
    "fat" : 26,
    "protein" : 12,
    "servingSize" : 100
}

我怎样才能用每种食物的营养信息代替膳食计划文件中的食物参考?我尝试了以下方法来获取所有需要的信息,但我只是没有成功将所有内容分组:

db.getCollection('mealPlans').aggregate([
 { "$unwind": "$meals" },
 { "$unwind": "$meals.foods" },
 { "$lookup": {
        "from": "foods",
        "localField": "meals.foods.food",
        "foreignField": "_id",
        "as": "meals.foods.food"
 }}
])

我已经挣扎了几个小时,尝试了不同的方法,结果都不同,但没有一种方法能得到正确的结果。欢迎任何建议。

谢谢

标签: mongodbmongodb-queryaggregation-framework

解决方案


您可以在所有管道之后添加它以重建您的foodsmeals数组,

  • $unwind解构食物阵列
  • $group重构foods数组
  • $group重构meals数组
  {
    $unwind: {
      path: "$meals.foods.food",
      preserveNullAndEmptyArrays: true
    }
  },
  {
    $group: {
      _id: {
        _id: "$_id",
        name: "$meals.name"
      },
      name: { $first: "$name" },
      foods: { $push: "$meals.foods" }
    }
  },
  {
    $group: {
      _id: "$_id._id",
      name: { $first: "$name" },
      meals: {
        $push: {
          name: "$_id.name",
          foods: "$foods"
        }
      }
    }
  }

操场


推荐阅读