【问题标题】:MongoDB: Aggregate documents from groups by highest value [duplicate]MongoDB:按最高值聚合组中的文档[重复]
【发布时间】:2016-05-12 18:02:25
【问题描述】:

使用聚合管道,我想为key 获取代表最高price 的文档。

以这个集合为例:

[
   {
      "_id":"323232",
      "name":"Something",
      "key":"A",
      "price":"100"
   },
   {
      "_id":"157236",
      "name":"Another thing",
      "key":"B",
      "price":75
   },
   {
      "_id":"555232",
      "name":"Something or another",
      "key":"B",
      "price":78
   },
   {
      "_id":"83234",
      "name":"Something or another",
      "key":"A",
      "price":20
   }
]

想要的结果:

[
   {
      "_id":"323232",
      "name":"Something",
      "key":"A",
      "price":"100"
   },
   {
      "_id":"555232",
      "name":"Something or another",
      "key":"B",
      "price":78
   }
]

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    我怀疑您是否可以使用单个阶段返回所有结果。据我所知,聚合创建了另一个带有结果的集合(如果我错了,希望其他人能纠正我)。您将获得最高价格和密钥,然后使用它来检索整个文档。

    获取每个键的最高价格;这是你的做法:

    db.collection.aggregate([{ $group:{ _id: "$key", maxprice:{$max:"$price"} } }])
    

    更新:

    评论中建议的link 实际上将 $sort 与 $match 一起使用,它也可以为您工作。

    希望有帮助

    【讨论】:

      【解决方案2】:

      这就是我所做的

      db.test.aggregate([
          {
              $group : {
                  _id : '$key',
                  maxVal : {$max : '$price'},
                  others : {$push : '$$ROOT'}
              }
          },
          {
              $unwind : '$others'
          },
          {
              $project : {
                  _id : '$others._id',
                  name : '$others.name',
                  key: '$others.key',
                  price: '$others.price',
                  pricecmp : {$cmp : ['$maxVal', '$others.price']}
              }
          },
          {
              $match : {pricecmp : {$eq : 0}}
          }
      ])
      

      这将是输出

      {
          "_id" : "555232",
          "name" : "Something or another",
          "key" : "B",
          "price" : 78,
          "pricecmp" : 0
      }
      {
          "_id" : "323232",
          "name" : "Something",
          "key" : "A",
          "price" : "100",
          "pricecmp" : 0
      }
      

      【讨论】:

      • 看起来你的比我的回答更完整。竖起大拇指。
      • @ibininja 谢谢! :)
      • 有什么方法可以投影所有字段而不必在$project阶段指定?
      • 你可以写$project 像:$project : { others : 1, pricecmp : {$cmp : ['$maxVal', '$others.price'] }} 但这会移动一个子文档中的所有键名others
      猜你喜欢
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 2019-04-26
      • 1970-01-01
      • 2017-07-17
      相关资源
      最近更新 更多