【发布时间】:2020-07-13 14:45:50
【问题描述】:
编辑:我原来的问题是
MongoDb 聚合:您可以在 $lookup 阶段的管道中 $unwind 输入文档变量吗?
考虑下面的代码:
{$lookup: {
from:"mydoc",
let: {"c":"$myArray"},
pipeline: [
{$unwind: "$$c"},
]
as:"myNewDoc"
}}
如果我愿意,我将如何放松 c?
/////原始问题结束
-----编辑-----
从 Tom Slabbaert 的评论中,我们现在知道可以在 $lookup 阶段的管道中 $unwind 输入文档变量。但不推荐。
我想达到什么目的?
考虑这些集合,poll 和 castedvote 来自 this answer 来自 a question I had asked。
我正在尝试获得如下输出:
numberOfVotes: 6,
hasThisUserVoted: true,
numberOfComments: 12,
castedVotesPerChoice:{
"choiceA": [
{"_id": ObjectId("..."), "voter": "Juzi", "choice": 0, "pollId": 100 },
{"_id": ObjectId("..."), "voter": "Juma", "choice": 0, "pollId": 100 },
{"_id": ObjectId("..."), "voter": "Jane", "choice": 0, "pollId": 100 },
],
"choiceB": [
{"_id": ObjectId("..."), "voter": "Jamo", "choice": 1, "pollId": 100 },
{"_id": ObjectId("..."), "voter": "Juju", "choice": 1, "pollId": 100 },
{"_id": ObjectId("..."), "voter": "Jana", "choice": 1, "pollId": 100 }
],
"choiceC": [ ]
}
我目前的实现:
db.poll.aggregate([
{"$match": {"_id": 100}},
// ...lookup to get comments
{"$lookup": {
"from":"castedvotes",
"let": {"pollId":"$_id"},
"pipeline":[
{"$match":
{"$expr":
{"$eq": ["$pollId", "$$pollId"]},
}},
],
"as":"votes" // will use this to get number of votes and find out if the authenticated user has voted.
}},
{"$unwind":"$choices"},
{"$lookup": {
"from":"castedvotes",
"let": {"c":"$choices"},
"pipeline":[
{"$match":
{"$expr":
{"$eq": ["$choice", "$$c.id"]},
}},
],
"as":"votesPerChoice"
}},
])
我当前实现的问题是它对同一个集合进行了两次查找,我觉得这是不必要的,它使代码不枯燥。
使用$unwind,我知道我可以按照here 的描述取消$unwind。
所以我的问题是如何通过 $lookup 对已投票集合获得所需的输出?由于两个查找返回相同的数据。
或者以不同的方式提出问题,当给定 array-1 和 array-2 时,如何在 mongodb 聚合中基于另一个 array-2 对 array-1 进行分组?
This question 回答了如何通过以某种方式构造$lookup 阶段来基于 mongodb 聚合中的另一个数组对数组进行分组。它没有回答我的问题。
【问题讨论】:
-
你能展示你正在尝试处理的数据和预期的结果吗?
-
内部管道在“mydoc”集合上运行,因此外部参数不能真正像那样展开。你必须首先
$addFields,例如c: "$$c",然后你可以放松,但不推荐这样做。如果你想解释你想要达到的目标,也许我可以进一步帮助你。 -
@TomSlabbaert 我已按要求更新了问题。谢谢。
-
@mickl 我已按要求更新问题。谢谢
-
请使用以下结构编辑您的问题:元、示例数据、您尝试过的内容、您的期望。您当前的帖子有点困惑,我们需要点击一些链接并获取部分问题、解决方案等。
标签: mongodb mongodb-query aggregation-framework