【问题标题】:$match stage is not giving any output in MongoDB aggregation$match 阶段在 MongoDB 聚合中没有给出任何输出
【发布时间】:2019-05-25 08:43:25
【问题描述】:

我需要打印超过同一集合中一个字段平均值的文档。

在聚合管道中,我没有获得可用于$match 阶段(下一阶段)的 avg_pmnt 参数

如下代码

db.payments.aggregate([
    {$group: {
        "_id":1, 
        "avg_pmnt": {$avg: "$AMOUNT"}, 
        "AMNT": {$push: "$AMOUNT"}
    } },
    {$unwind: "$AMNT"},
    {$project: {avg_pmnt: "$avg_pmnt", AMNT: "$AMNT"}},
])

我得到以下输出:

{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 14191 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 32642 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 33348 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 45864 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 82261 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 7565 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 44895 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 19502 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 47924 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 49524 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 50219 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 1491 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 17876 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 34638 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 101245 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 85411 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 11044 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 83598 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 6067 }
{ "_id" : 1, "avg_pmnt" : 32431.65567765568, "AMNT" : 14571 }

输入"it"了解更多信息

但我想过滤它们

所以,我试过这个:

db.payments.aggregate([
    {$group: {
        "_id":1, 
        "avg_pmnt": {$avg: "$AMOUNT"}, 
        "AMNT": {$push: "$AMOUNT"}
    } },
    {$unwind: "$AMNT"},
    {$project: {avg_pmnt: "$avg_pmnt", AMNT: "$AMNT"}},
    {$match: {AMNT: {$gt: "$avg_pmnt"} }}
])

我没有收到任何文件(空集)。

我也试过了

db.payments.aggregate([
    {$group: {
        "_id":1, 
        "avg_pmnt": {$avg: "$AMOUNT"}, 
        "AMNT": {$push: "$AMOUNT"}
    } },
    {$unwind: "$AMNT"},
    {$project: {avg_pmnt: "$avg_pmnt", AMNT: "$AMNT"}},
    {$match: {AMNT: {$gt: 1} }}
])

我正在获取所有文档,因为每个文档的条件都满足。

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    您也可以使用$redact 在同一文档字段内进行比较并过滤文档

    db.payments.aggregate([ 
        {$group: { "_id":1, "avg_pmnt": {$avg: "$AMOUNT"}, "AMNT": {$push: "$AMOUNT"} } }, 
        {$unwind: "$AMNT"}, 
        {$project: {avg_pmnt: "$avg_pmnt", AMNT: "$AMNT"}}, 
        {$redact :{$cond : [{$gt: ["$AMNT", "$avg_pmnt" ]},"$$DESCEND","$$PRUNE"]}}
    ])
    

    【讨论】:

      【解决方案2】:

      当您尝试比较 $match 阶段内的两个字段时,您应该使用 $expr

      db.payments.aggregate([ 
          {$group: { "_id":1, "avg_pmnt": {$avg: "$AMOUNT"}, "AMNT": {$push: "$AMOUNT"} } }, 
          {$unwind: "$AMNT"}, 
          {$project: {avg_pmnt: "$avg_pmnt", AMNT: "$AMNT"}}, 
          {$match: { $expr: { $gt: [ "$AMNT", "$avg_pmnt" ] } }  } 
      ])
      

      【讨论】:

      • 谢谢。实际上,我是 MongoDB 新手。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-05
      • 2018-12-19
      • 2019-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多