MongoDB добавить в поле присоединения коллекции из базовой - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть две коллекции:

Игры со схемой:

 _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',     
      },   
     }])

, который возвращает мне всю необходимую информацию, с правильным объединением в соответствии с массивом вопросов,

 _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 для массива вопросов в коллекции игр, немного играл с $project в aggregation, но все еще безрезультатно.

Итак , мой вопрос: как добавить поле из базовой коллекции в объединенные данные из другой коллекции

1 Ответ

0 голосов
/ 20 сентября 2018

Сначала необходимо $unwind массив questions, а затем необходимо применить $lookup и, наконец, использовать$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" }
  }}
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...