为此,在MongoDB中将$group和$max一起使用。让我们创建一个包含文档的集合-
> db.demo510.insertOne(
... {
... details:[
... {
... Name:"Chris",
... Score:56
... },
... {
... Name:"David",
... Score:45
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e8845fa987b6e0e9d18f582")
}
> db.demo510.insertOne(
... {
... details:[
... {
... Name:"Chris",
... Score:56
... },
... {
... Name:"David",
... Score:47
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e8845fb987b6e0e9d18f583")
}
> db.demo510.insertOne(
... {
... details:[
... {
... Name:"Chris",
... Score:45
... },
... {
... Name:"David",
... Score:91
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e8845fb987b6e0e9d18f584")
}
在find()
方法的帮助下显示集合中的所有文档-
> db.demo510.find();
这将产生以下输出-
{ "_id" : ObjectId("5e8845fa987b6e0e9d18f582"), "details" : [ { "Name" : "Chris", "Score" : 56 },
{ "Name" : "David", "Score" : 45 } ] }
{ "_id" : ObjectId("5e8845fb987b6e0e9d18f583"), "details" : [ { "Name" : "Chris", "Score" : 56 },
{ "Name" : "David", "Score" : 47 } ] }
{ "_id" : ObjectId("5e8845fb987b6e0e9d18f584"), "details" : [ { "Name" : "Chris", "Score" : 45 },
{ "Name" : "David", "Score" : 91 } ] }
以下是查询以聚合中的最大值匹配和分组数组元素-
> db.demo510.aggregate([
... { "$project": {
... "details": {
... "$arrayElemAt": [
... { "$filter": {
... "input": "$details",
... "as": "res",
... "cond": {
... "$eq": [
... "$$res.Score",
... { "$max": {
... "$map": {
... "input": "$details",
... "as": "out",
... "in": "$$out.Score"
... }
... }}
... ]
... }
... }},
... 0
... ]
... }
... }},
... { "$group": {
... "_id": "$details.Name",
... "Name": { "$first": "$details.Name" },
... "count": { "$sum": 1 }
... }}
... ])
这将产生以下输出-
{ "_id" : "David", "Name" : "David", "count" : 1 }
{ "_id" : "Chris", "Name" : "Chris", "count" : 2 }