我有一个来自管道的输出文档,例如:{upvotes : 1, downvotes : 5}
。我只想把它传递给管道的下一部分。我做了这样的事情:
{
$group :{
_id : "$_id",
upvotes : {$max : "$upvotes"},
downvotes : {$max : "$downvotes"},
average : {$avg : "$statements.result"},
count : {$max : "$count"}
}
}
我不想使用max我不想要任何东西。我只想要字段和值:{upvotes : 1, downvotes : 5}
。让我们说他们不是数字。让我们说字段是对象我想要输出该字段的所有对象而不是最大值
让这个问题更加清晰:如何在不使用max
的情况下获取字段和值?
输出:
[ { _id: 57aea6791016c0b023a71e9d,
upvotes: 3,
downvotes: 1,
average: 7.857142857142857,
count: 5 },
{ _id: 57aed883139c1e702beb471e,
upvotes: 0,
downvotes: 1,
average: 7,
count: 1 } ]
输出很好,但我不想用max来获取它。
出于某种原因,我认为我需要一个Accumulator Operator。这就是我使用max
的原因。
答案 0 :(得分:0)
由于您按" $ _ id"进行分组,因此您根本不进行分组。您的结果将与您的初始数据集1:1相关联。为了完成你的要求,在不使用像$ max这样的聚合函数的情况下传递upvotes和downvotes,你只需将它们包含在你的组阶段的_id中,这是你按键指定组的地方。
所以你会这样做:
{
$group :{
_id : {
"_id":"$_id",
"upvotes": "$upvotes",
"downvotes": "$downvotes"
}
average : {$avg : "$statements.result"},
count : {$max : "$count"}
}
}
但是,您最终将与原始数据保持1:1的相关性。
答案 1 :(得分:0)
在您的问题主题之后,您所讨论的管道很可能是来自 $unwind
操作的前一个管道步骤,因此以下建议的解决方案基于该假设。请随意提出建议。
要使用累加器在 $group
管道中添加字段, $first
或 $last
看起来最合适,因为您刚刚对数组进行了扁平处理,这些运算符将从每个组的第一个/最后一个文档返回一个值。意味着,如果该字段不是展平数组的一部分,则 $first
/ $last
会在$unwind
。
{
"$group" :{
"_id": "$_id",
"upvotes": { "$first": "$upvotes"},
"downvotes": { "$first": "$downvotes"},
"average": { "$avg": "$statements.result"},
"count": { "$max": "$count"}
}
}