Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 我如何不仅保留最大值,而且保留具有最大值的记录_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

Mongodb 我如何不仅保留最大值,而且保留具有最大值的记录

Mongodb 我如何不仅保留最大值,而且保留具有最大值的记录,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我想使用$max运算符来选择最大值 并使用“原始文档”键保留max记录 我怎么能在mongoDB做呢 预期结果 当前结果 文件 聚集 当您需要来自同一分组项目的详细信息时,则对要保留的文档中的字段使用和: db.sales.aggregate([ {“$project”:{ “项目”:1, “总额”:{“$multiply”:[“$price”,“$quantity”]}, “数量”:1 }}, {“$sort”:{“TotalAmount”:-1}, {“$组”:{ “_id”:“$item”

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

并使用“原始文档”键保留max记录

我怎么能在mongoDB做呢

预期结果 当前结果 文件 聚集
当您需要来自同一分组项目的详细信息时,则对要保留的文档中的字段使用和:

db.sales.aggregate([
{“$project”:{
“项目”:1,
“总额”:{“$multiply”:[“$price”,“$quantity”]},
“数量”:1
}},
{“$sort”:{“TotalAmount”:-1},
{“$组”:{
“_id”:“$item”,
“maxTotalAmount”:{“$max”:“$TotalAmount”},
“最大数量”:{“$max”:“$quantity”},
“doc_id”:{“$first”:“$_id”},
“单据数量”:{“$first”:“$QUOTE”}
}}
])
聚合“累加器”不能使用嵌入的字段,将所有字段推送到一个数组也没有什么意义。但是,您可以像上面那样命名,甚至可以使用另一个
$project
重命名,如果您愿意,也可以在代码中重命名

为了证明这样做是多么不切实际,这里有一个例子:

db.sales.aggregate([
{“$组”:{
“_id”:“$item”,
“maxTotalAmount”:{“$max”:{“$multiply”:[“$price”,“$quantity”]},
“最大数量”:{“$max”:“$quantity”},
“文档”:{“$push”:{
“\u id”:“$\u id”,
“数量”:“$quantity”,
“总额”:{“$multiply”:[“$price”,“$quantity”]}
}}            
}},
{“$project”:{
“maxTotalAmount”:1,
“最大数量”:1,
“maxTotalDocs”:{
“$setDifference”:[
{“$map”:{
“输入”:“$docs”,
“as”:“doc”,
“在”:{
“$cond”:[
{“$eq”:[“$maxTotalAmount”,“$$doc.TotalAmount”]},
“$$doc”,
假的
]
}
}},
[错误]
]
}
}}
])

这不是一个好主意,因为您正在将分组条件中的每个文档推送到一个数组中,只是为了过滤掉以后需要的文档。对于任何合理的数据大小,这都是不可行的,并且可能会中断。

请检查以下内容:

   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" }} 
               }
    ]);
{ "_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" }
         }
     }
   ]
)
   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" }} 
               }
    ]);