Укажите несколько условий соединения с помощью $ lookup в mongodb - PullRequest
0 голосов
/ 27 января 2019

У меня есть две коллекции, к которым я хочу присоединиться как 2 условия. The examId и user Id. Я использую mongodb версии 4 и nodejs.tgongous в моем экзамене по приложениям нет:

{"_id" : ObjectId("5c4c21d8f45b3d53ff8c20a3"),
  "title" : "first azmoon",
  "time" : 600,
  "preLesson" : {
   "label" : "Lesson 13",
   "value" : ObjectId("5c484e1852faa438c36c3da1")
},
}

result: { "_id" : ObjectId("5c4993d5d0dc6f39c0f324bd"), "usrId" : ObjectId("5c484e8852faa438c36c3da2"), "lsnId" : ObjectId("5c484e1852faa438c36c3da1"), "passedLesson" : false, "timePassed" : "", "quiz" : { "time" : "5", "questionTrue" : 0, "getScore" : 0, "permission" : true, "quizScore" : 15, "quizCount" : 3 }, "exam" : { "examScore" : 0, "examCount" : 0, "getScore" : 0, "time" : 600, "questionTrue" : 0, "permission" : false, "exId" : ObjectId("5c4c21d8f45b3d53ff8c20a3") } }

Мне нужен результат, который выглядит как его SQL-код psodou:

select * from exams left join result on exam._id = result.exam.exaId 
     where result.usrId =  ObjectId("5c484e8852faa438c36c3da2")

Я сделал следующее, но он только присоединяется к экзамену и результату без каких-либо условий

   con.collection("exam").aggregate([
            {
                $lookup: {
                    from: "result",
                    let: {exaId: "$_id"},
                    pipeline: [
                        {
                            $match: {
                                $expr: {
                                    $and: [
                                         {$eq: ["exam.exId", "exaId"]},
                                        {"usrId": new 
                                       ObjectID(`${usrId}`)}
                                    ]
                                }
                            }
                        },
                    ],
                    as: "result"
                }
            },
            {
                $lookup: {
                    from: "lesson",
                    localField: "preLesson.value",
                    foreignField: "_id",
                    as: "lesson"
                },

            }
        ])

Я не знаю, в чем проблема, я буду признателен, если кто-нибудь может помочь мне, пожалуйста, с этим.

1 Ответ

0 голосов
/ 27 января 2019

Вы пропустили $ знак внутри $eq оператор

con.collection("exam").aggregate([
  { "$lookup": {
    "from": "result",
    "let": { "exaId": "$_id" },
    "pipeline": [
      { "$match": {
        "$expr": { "$eq": ["$exam.exId", "$$exaId"] },
        "usrId": mongoose.Types.ObjectID(`${usrId}`)
      }}
    ],
    "as": "result"
  }},
  { "$lookup": {
    "from": "lesson",
    "localField": "preLesson.value",
    "foreignField": "_id",
    "as": "lesson"
  }}
])
...