问题描述
这里是我的 MongoDB 数据库的两个模型。
QuestionsInfo
{
"_id": ObjectId("60e5f5fce2446faa95e6eca7"),"courseName": "ML","user": ObjectId("6087dc4c2ba7a828363c9fca"),"questions": [
{
"questionInput": {
"question": "This is the first Question. `(a+b)^2` ",},"id": "aLC/QNz/AOLO9Fyj7oJT","createdAt": "2021-07-07T18:41:18.971Z"
},{
"questionInput": {
"question": "This is the first Question. `(a+b)^2` ","id": "aLC/QNz/AOLO9Fyj7oJJ","createdAt": "2021-07-07T18:41:19.971Z"
},{
"questionInput": {
"question": "This is the third Question.ΒΓ","id": "qPgd261wVGizOuR1b9RT","createdAt": "2021-07-07T18:46:25.203Z"
}
]
}
ExamInfo
questionsInfo
是 QuestionsInfo
模型的 ID。这是由 MongoDB 参考创建的。
{
"_id": ObjectId("60e5f88159292f575c0ca17f"),"questionsId": [
"aLC/QNz/AOLO9Fyj7oJT","aLC/QNz/AOLO9Fyj7oJJ"
],"questionsInfo": ObjectId("60e5f5fce2446faa95e6eca7"),}
我想使用填充到 QuestionsInfo
模型中,从 questionsId
中查找与 ExamInfo
列表匹配的问题。
我该怎么做?提前致谢。
解决方法
这是实现这一目标的方法。
{
$lookup: {
from: "questionsInfo",let: {
qId: "$questionsInfo",internalQIds: "$questionsId"
},as: "questionsInfo",pipeline: [
// first match question info document
{
$match: {
$expr: {
$eq: [
"$_id","$$qId"
]
}
}
},// unwind all nested questions
{
$unwind: "$questions"
},// match only required questions
{
$match: {
$expr: {
$in: [
"$questions.id","$$internalQIds"
]
}
}
},// regroup
{$group: {
_id: "$_id",courseName: {
$first: "$courseName"
},user: {
$first: "user"
},questions: {
$push: "$questions"
}
}
},]
}
}
现在由于查找返回数组,您可以使用类似的方法从数组中取出问题信息。
{
"$addFields": {
"questionsInfo": {
"$arrayElemAt": [
"$questionsInfo",0
]
}
}
}