【问题标题】:pass along the field and value while aggregating在聚合时传递字段和值
【发布时间】:2016-12-20 14:40:16
【问题描述】:

我有一个来自管道的输出文档,例如:{upvotes : 1, downvotes : 5}。我只是想把它传递给管道的下一部分。我做了这样的事情:

{
    $group :{
        _id : "$_id",
        upvotes : {$max : "$upvotes"},
        downvotes : {$max : "$downvotes"},
        average : {$avg : "$statements.result"},
        count : {$max : "$count"}
    }
}

我不想使用最大值我不想要任何东西的最大值。我只想要字段和值:{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 的原因。

【问题讨论】:

  • 在这里看不到明确的问题?
  • 哪部分不清楚?
  • 我仍在尝试解析代码块之后的语言。有点伤我的头。您不只是在寻找 $group.upvotes 或其他字段之一,因为它没有最大值,而是其他对象(一个带有赞成票、反对票的对象)?
  • 使用 $group 时,您可以创建一个字段,我希望该字段的值是管道先前输出的字段值。在我的情况下,这两个字段具有相同的名称。 {upvotes : 1, downvotes : 5} 是管道上一步的输出。我希望 {upvotes : 1, downvotes : 5} 出现在下一个输出中。一个技巧是使用max。还有什么办法?
  • 出于某种原因,我认为我需要一个累加器运算符。这就是我使用 max 的原因。 docs.mongodb.com/manual/reference/operator/aggregation/group/…

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


【解决方案1】:

由于您是按“$_id”分组的,因此您实际上根本没有分组。您的结果将与您的初始数据集 1:1 相关联。为了完成您的要求,在不使用 $max 之类的聚合函数的情况下传递赞成票和反对票,您只需将它们包含在您的小组赛阶段的 _id 中,您可以在其中按键指定您的小组。

所以你会这样做:

{
    $group :{
        _id : {
            "_id":"$_id",
            "upvotes": "$upvotes",
            "downvotes": "$downvotes"
        }
        average : {$avg : "$statements.result"},
        count : {$max : "$count"}
    }
}

但是,您最终会得到与原始数据 1:1 的相关性。

【讨论】:

    【解决方案2】:

    在您的问题线程之后,您有问题的管道很可能是 $unwind 操作的前一个管道步骤,因此以下建议的解决方案基于该假设。请随时提出其他建议。

    要使用累加器在 $group 管道中包含一个字段,$first$last 似乎在这里最合适因为您刚刚展平了一个数组,并且这些运算符将从每个组的第一个/最后一个文档中返回一个值。意思是如果该字段不是展平数组的一部分,那么 $first/$last 会在 $unwind 之前为您提供其实际值发生了。

    {
        "$group" :{
            "_id": "$_id",
            "upvotes": { "$first": "$upvotes"},
            "downvotes": { "$first": "$downvotes"},
            "average": { "$avg": "$statements.result"},
            "count": { "$max": "$count"}
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-20
      • 2010-12-20
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多