编辑:我最初的问题是
MongoDb聚合:能否在$lookup阶段的管道中$unwind输入文档变量?
考虑下面的代码:
{$lookup: {
from:"mydoc",
let: {"c":"$myArray"},
pipeline: [
{$unwind: "$$c"},
]
as:"myNewDoc"
}}
如果我想的话,我该如何放松c
?
////原问题结束
从Tom Slabbaert的评论中,我们现在知道可以在$lookup阶段的管道中$展开输入文档变量。但不推荐。
我想要实现什么?
从我提出的问题的答案中,考虑这些集合,即代码>投票调查问卷/代码>和<代码> CASTEDPosiv>代码>。
我正在尝试获得如下输出:
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
我知道我可以按此处所述取消$unwind
。
因此,我的问题是,如何通过对强制投票集合进行一次$lookup来获得所需的输出?因为两个查找都返回相同的数据。
或者以不同的方式问这个问题,当给定array-1和array-2时,我如何在mongob聚合中基于另一个array-2对array-1进行分组?
这个问题回答了如何通过以某种方式构造$lookup
阶段,基于mongodb聚合中的另一个数组对数组进行分组。它没有回答我的问题。
如果我正确理解了“拼图”文章(文章标题和编辑是不同的用例),我们可以通过单个$lookup
,获得所需的结果:
db.poll.aggregate([
{
"$match": {
"_id": 100
}
},
{
"$lookup": {
"from": "castedvotes",
"localField": "pollId",
"foreignField": "choices.id",
"as": "voters"
}
},
{
$project: {
numberOfVotes: {
$size: "$voters"
},
hasThisUserVoted: {
$in: [
"$_id",
"$voters.pollId"
]
},
/**How to calculate it?*/
numberOfComments: {
$multiply: [
{
$size: "$voters"
},
2
]
},
castedVotesPerChoice: {
$arrayToObject: {
$map: {
input: "$choices",
as: "choice",
in: {
k: "$$choice.name",
v: {
$filter: {
input: "$voters",
as: "voter",
cond: {
$eq: [
"$$voter.choice",
"$$choice.id"
]
}
}
}
}
}
}
}
}
}
])
MongoPlayground
二维数组是数组中的数组。 它是一个数组数组。 在这种类型的数组中,数据元素的位置由两个索引而不是一个索引引用。 因此它表示一个包含行和数据dcolumns的表。 在下面的二维数组示例中,观察者认为每个数组元素本身也是一个数组。 考虑每天记录4次温度的例子。 有时记录仪器可能有故障,我们无法记录数据。 4天的这种数据可以表示为如下的二维阵列。 Day 1 - 11 12 5 2 Day 2 - 1
问题内容: 我有一个数组,例如我的数据列表为JSON。// 我想结合像2的数组,我试图追加它们。-合并-追加 控制者 Beego(golang)API返回JSON 问题答案: 希望是你想要的
问题内容: 之间有什么区别(如果有) 和 我应该使用哪一个? 问题答案: 该规范说: 当作为函数而不是构造函数调用时,它将创建并初始化一个新的Array对象。因此,函数调用等效于具有相同参数的对象创建表达式。
Given two sorted integer arrays A and B, merge B into A as one sorted array. Note: You may assume that A has enough space (size that is greater or equal to m + n) to hold additional elements from B. T
两者之间有实际区别吗 和 ? 看起来包含常量元素的非常量数组仍然无法交换,赋值运算符也不起作用<我什么时候应该选择一个而不是另一个?
Rotate Array 描述 Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4]. Note: Try to come up as many solution