我怎么能不仅保留最大值,还保留具有最大值的记录

时间:2015-07-27 07:08:16

标签: mongodb mongodb-query aggregation-framework

我想使用$ max运算符来选择最大值。

并使用键" original_document"

保留最大记录

我怎么能在mongoDB中做到这一点

期待结果

{ "_id" : "abc", "maxTotalAmount" : 100, 

"maxQuantity" : 10, 

"original_document": {{ "_id" : 4, "item" : "abc", "price" : 10, "quantity" : 10, "date" : ISODate("2014-02-15T08:00:00Z") }}}

当前结果

{ "_id" : "abc", "maxTotalAmount" : 100, "maxQuantity" : 10 }

的文件

{ "_id" : 1, "item" : "abc", "price" : 10, "quantity" : 2, "date" : ISODate("2014-01-01T08:00:00Z") }
{ "_id" : 4, "item" : "abc", "price" : 10, "quantity" : 10, "date" : ISODate("2014-02-15T08:00:00Z") }

聚合

db.sales.aggregate(
   [
     {
       $group:
         {
           _id: "$item",
           maxTotalAmount: { $max: { $multiply: [ "$price", "$quantity" ] } },
           maxQuantity: { $max: "$quantity" }
         }
     }
   ]
)

2 个答案:

答案 0 :(得分:1)

当您需要来自同一分组项目的详细信息时,请使用$sort$first作为您要保留的文档中的字段:

db.sales.aggregate([
    { "$project": {
       "item": 1,
       "TotalAmount": { "$multiply": [ "$price", "$quantity" ] },
       "quantity": 1
    }},
    { "$sort": { "TotalAmount": -1 } },
    { "$group": {
        "_id": "$item",
        "maxTotalAmount": { "$max": "$TotalAmount" },
        "maxQuantity": { "$max": "$quantity" },
        "doc_id": { "$first": "$_id" },
        "doc_quantity": { "$first": "$quantity" }    
    }}
])

聚合“accumulators”不能使用嵌入字段,并且将all全部推送到数组是没有意义的。但您可以像上面一样命名,甚至可以使用其他$project或代码重命名。如果您愿意的话。

只是为了证明这是不切实际的做法,就是这个例子:

db.sales.aggregate([
    { "$group": {
        "_id": "$item",
        "maxTotalAmount": { "$max": { "$multiply": [ "$price", "$quantity" ] } },
        "maxQuantity": { "$max": "$quantity" },
        "docs": { "$push": {
            "_id": "$_id",
            "quantity": "$quantity",
            "TotalAmount": { "$multiply": [ "$price", "$quantity" ] }
        }}            
    }},
    { "$project": {
        "maxTotalAmount": 1,
        "maxQuantity": 1,
        "maxTotalDocs": {
            "$setDifference": [
                { "$map": {
                    "input": "$docs",
                    "as": "doc",
                    "in": {
                        "$cond": [
                           { "$eq": [ "$maxTotalAmount", "$$doc.TotalAmount" ] },
                           "$$doc",
                           false
                        ]
                    }
                }},
                [false]
            ]
        }
    }}
])

这不是一个好主意,因为您将分组条件中的每个文档都推送到一个数组中,只过滤掉您以后想要的文档。在任何可重新配置的数据大小上,这是不实际的,可能会破坏。

答案 1 :(得分:1)

请检查以下内容:

   db.qt.aggregate([
    { "$project":  { "maxTotalAmount" : { "$multiply" : 
                                          [ "$price", "$quantity" ] 
                                        } , 
                    "currentDocumnet" : { "_id" : "$_id" , 
                    "item" : "$item",  "price" : "$price", 
                    "quantity" : "$quantity", 
                    "date" : "$date" } } 
    },
    {"$sort" : { "currentDocumnet.item" : 1 , maxTotalAmount : -1}},
    {"$group" :{ _id : "$currentDocumnet.item" , 
                 currentDocumnet :  { "$first" : "$currentDocumnet"} , 
                 maxTotalAmount : { "$first" : "$maxTotalAmount"} ,
                 maxQuantity:  { "$max" : "$currentDocumnet.quantity" }} 
               }
    ]);