Выбрать из коллекции a on предложение из JOIN on collection b - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть две коллекции: games и questions
game схема:

{ 
  _id: ObjectId, 
  status: 'played',
  questions: 
     [ 
       { questionId: ObjectId(questions._id) } // ref to questions collection by _id field
     ] 
 }

questions схема:

{
  _id: ObjectId(),
  text: foobar
}

В игре может быть двестатусы: «активные» и «сыгранные».
Моя цель - получить все «сыгранные» вопросы, средства, вопросы, связанные с играми, со статусом «сыграно».

Я пробовалчтобы делать запросы к коллекции games, пытался делать запросы к questions, но ни один из них не работал.

Некоторые из них:

db.games.aggregate([
     {$match: {status: {$ne: 'played'}}}, 
     {
         $lookup: 
           {
            from: 'questions', 
            localField: 'questions.questionId', 
            foreignField: '_id', 
            as: 'game_questions'
         }
      }, 
    {$project: {game_questions: 1}}, 
    {$unwind: {path: '$game_questions', preserveNullAndEmptyArrays: false}}
   ])

или

db.questions.aggregate([
     { $project: {text: 1}}, 
     { $lookup: {
        from: 'games', 
        pipeline: [
           { $match: {status:'played' }}, 
           { $project: { status: 1 }}
        ], 
        as: 'game_data' 
      }}
])

Итог : После запроса я хотел бы получить список с вопросами, где статус игры «играл».

1 Ответ

0 голосов
/ 14 ноября 2018

Вы можете использовать $unwind и $replaceRoot с данными, найденными в $lookup этап

db.games.aggregate([
  { "$match": { "status": "played" }},
  { "$lookup": {
    "from": "questions",
    "let": { "questions": "$questions.questionId" },
    "pipeline": [
      { "$match": { "$expr": { "$in": ["$_id", "$$questions"] }}}
    ],
    "as": "game_data"
  }},
  { "$unwind": "$game_data" },
  { "$replaceRoot": { "newRoot": "$game_data" }}
])

Или

db.games.aggregate([
  { "$match": { "status": "played" }}, 
  { "$lookup": {    
    "from": "questions", 
    "localField": "questions.questionId", 
    "foreignField": "_id", 
    "as": "game_data"
  }}, 
  { "$unwind": "$game_data" },
  { "$replaceRoot": { "newRoot": "$game_data" }}
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...