聚合时传递字段和值

时间:2016-08-13 21:54:27

标签: javascript node.js mongodb mongoose aggregation-framework

我有一个来自管道的输出文档,例如:{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的原因。

2 个答案:

答案 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"}
    }
}