我有两个集合,其中一个具有一个数组,其中另一个数组具有ID。我需要从第一个集合中返回一个元素,并从第二个集合中返回一个元素,但仅返回具有特定字段的元素。我会澄清一下。
我尝试使用它来做某事,但无法完全理解操作。https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/
我的问题:
{
"solved": false,
"answer": [
"5d969dbf7d496a256443eeca",
"5d969f7b7d496a256443eecb"
],
"_id": "5d93dfaf40024619dcc61896",
"user": "5d8963afa0014a289c8d7112",
"title": "Ola mundo",
"description": "esse e um teste",
"discipline": "5d8fb8e04becf712f8293b5b",
"createdAt": "2019-10-01T23:22:23.168Z",
"__v": 0
},
我的遮阳篷
{
"official": false,
"_id": "5d969dbf7d496a256443eeca",
"description": "Toma aqui a sua resposta",
"createdAt": "2019-10-04T01:17:51.454Z",
"__v": 0
},
{
"official": true,
"_id": "5d969f7b7d496a256443eecb",
"description": "Esste e um teeeeste",
"createdAt": "2019-10-04T01:25:15.829Z",
"__v": 0
}
我需要返回问题模型和Awnser模型,其中“正式”字段等于“真”。我是mongoDB的新手,所以我正在寻求帮助。我以为可能在sql中有类似子查询的东西。
最简单的方法是使用聚合。
您需要使用$ lookup将答案数组中的所有ID都加入Answer集合中,然后使用$ filter通过“官方”对其进行过滤。
如果_id匹配,则从Answer集合中加入文档
{
$lookup: {
from: "Answer",
foreignField: "_id",
localField: "answer",
as: "answer"
}
}
结果将是:
{
"_id" : ObjectId("5d93dfaf40024619dcc61896"),
"solved" : false,
"answer" : [
{
"_id" : ObjectId("5d969dbf7d496a256443eeca"),
"official" : false,
"description" : "Toma aqui a sua resposta",
"createdAt" : "2019-10-04T01:17:51.454Z",
"__v" : 0
},
{
"_id" : ObjectId("5d969f7b7d496a256443eecb"),
"official" : true,
"description" : "Esste e um teeeeste",
"createdAt" : "2019-10-04T01:25:15.829Z",
"__v" : 0
}
],
"user" : "5d8963afa0014a289c8d7112",
"title" : "Ola mundo",
"description" : "esse e um teste",
"discipline" : "5d8fb8e04becf712f8293b5b",
"createdAt" : "2019-10-01T23:22:23.168Z",
"__v" : 0
}
现在您已加入文档,您可以使用$ addFields和$ filter在“官方”字段中对其进行过滤。 $ addFields将新字段添加到文档https://docs.mongodb.com/manual/reference/operator/aggregation/addFields/。在此解决方案中,我使用相同的字段名称“ answer”,它将用过滤的文档覆盖答案数组。
{
$addFields: {
answer: {
$filter: {
input: "$answer",
as: "answer",
cond: { $eq: [ "$$answer.official", true ] }
}
}
}
}
结果将是:
{
"_id" : ObjectId("5d93dfaf40024619dcc61896"),
"solved" : false,
"answer" : [
{
"_id" : ObjectId("5d969f7b7d496a256443eecb"),
"official" : true,
"description" : "Esste e um teeeeste",
"createdAt" : "2019-10-04T01:25:15.829Z",
"__v" : 0
}
],
"user" : "5d8963afa0014a289c8d7112",
"title" : "Ola mundo",
"description" : "esse e um teste",
"discipline" : "5d8fb8e04becf712f8293b5b",
"createdAt" : "2019-10-01T23:22:23.168Z",
"__v" : 0
}
这是完整的查询:
db.Question.aggregate([
{
$lookup: {
from: "Answer",
foreignField: "_id",
localField: "answer",
as: "answer"
}
},
{
$addFields: {
answer: {
$filter: {
input: "$answer",
as: "answer",
cond: { $eq: [ "$$answer.official", true ] }
}
}
}
}])
看起来您已经在使用猫鼬,因此可以使用populate with query condition解决您的问题。类似于:
Question.find(...).populate({
path: 'answer',
match: { official: true}
})