MongoDB 添加到从基础 1 开始的加入集合字段

MongoDB add to joining collection field from base one

我有两个合集:

具有架构的游戏:

 _id: ObjectId('gameId'),
 questions: [
   {
     position: 1,
     question_id: ObjectId('baz')
   },
   {
     position: 2,
     question_id: ObjectId('ban')
   },
 ]

架构问题:

 _id: ObjectId('baz'),
 text: 'FooBar'

现在我想将问题加入到游戏中,并添加到每个问题记录值 question_position

所以,我有这样的查询:

db.games.aggregate([
    {
      $lookup: {
        from: 'questions',       
        localField: 'questions.question_id',
        foreignField: '_id',       
        as: 'question_data',     
      },   
     }])

其中 return 我所有需要的信息,根据问题数组正确加入,

 _id: ObjectId('gameId'),
 questions: [
   {
     position: 1,
     question_id: ObjectId('baz')
   },
   {
     position: 2,
     question_id: ObjectId('ban')
   }
 ],
 question_data: [
   {
     _id: ObjectId('baz'),
     text: 'FooBar',
   },
   {
     _id: ObjectId('ban'),
     text: 'FooBar2',
   }
 ]

但我完全不知道如何根据游戏将其位置添加到连接问题中。 看起来像这样:

 _id: ObjectId('gameId'),
 questions: [
   {
     position: 1,
     question_id: ObjectId('baz')
   },
   {
     position: 2,
     question_id: ObjectId('ban')
   }
 ],
 question_data: [
   {
     _id: ObjectId('baz'),
     text: 'FooBar',
     position: 1,
   },
   {
     _id: ObjectId('ban'),
     text: 'FooBar2',
     position: 2,
   }
 ]


我已经尝试在游戏合集中使用 $unwind 作为问题数组,在 aggregation 中使用 $project 玩了一点但仍然没有结果。

所以,我的问题是,如何将基础集合中的字段添加到另一个集合中的连接数据

您需要先$unwind the questions array and then need to apply $lookup and finally use $group回滚到数组中。

db.games.aggregate([
  { "$unwind": "$questions" },
  { "$lookup": {
    "from": "questions",
    "localField": "questions.question_id",
    "foreignField": "_id",
    "as": "question_data"
  }},
  { "$unwind": "$question_data" },
  { "$addFields": {
    "question_data.position": "$questions.position",
    "question_data.question_id": "$questions.question_id"
  }},
  { "$group": {
    "_id": "$_id",
    "questions": { "$push": "$questions" },
    "question_data": { "$push": "$question_data" }
  }}
])