Mongodb 我如何不仅保留最大值,而且保留具有最大值的记录
我想使用$max运算符来选择最大值 并使用“原始文档”键保留max记录 我怎么能在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”
当您需要来自同一分组项目的详细信息时,则对要保留的文档中的字段使用和:
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" }}
}
]);