使用MongoDB的多级$ group
要实现多级$group,请使用MongoDB聚合。让我们创建一个包含文档的集合-
> db.demo76.insertOne({ Name:"Chris","Age" : 21, "CountryName" : 'US' }); { "acknowledged" : true, "insertedId" : ObjectId("5e2bd3e571bf0181ecc42281") } > db.demo76.insertOne({ Name:"Chris","Age" : 21, "CountryName" : 'US' }); { "acknowledged" : true, "insertedId" : ObjectId("5e2bd3e571bf0181ecc42282") } > db.demo76.insertOne({ Name:"Chris","Age" : 23, "CountryName" : 'UK' }); { "acknowledged" : true, "insertedId" : ObjectId("5e2bd3e571bf0181ecc42283") } > db.demo76.insertOne({ Name:"Chris","Age" : 23, "CountryName" : 'UK' }); { "acknowledged" : true, "insertedId" : ObjectId("5e2bd3e571bf0181ecc42284") } > db.demo76.insertOne({ Name:"Chris","Age" : 21, "CountryName" : 'AUS' }); { "acknowledged" : true, "insertedId" : ObjectId("5e2bd3e571bf0181ecc42285") } > db.demo76.insertOne({ Name:"Chris","Age" : 21, "CountryName" : 'AUS' }); { "acknowledged" : true, "insertedId" : ObjectId("5e2bd3e571bf0181ecc42286") } > db.demo76.insertOne({ Name:"Chris","Age" : 23, "CountryName" : 'AUS' }); { "acknowledged" : true, "insertedId" : ObjectId("5e2bd3e571bf0181ecc42287") } > db.demo76.insertOne({ Name:"Chris","Age" : 21, "CountryName" : 'UK' }); { "acknowledged" : true, "insertedId" : ObjectId("5e2bd3e571bf0181ecc42288") }
在find()
方法的帮助下显示集合中的所有文档-
> db.demo76.find();
这将产生以下输出-
{ "_id" : ObjectId("5e2bd3e571bf0181ecc42281"), "Name" : "Chris", "Age" : 21, "CountryName" : "US" } { "_id" : ObjectId("5e2bd3e571bf0181ecc42282"), "Name" : "Chris", "Age" : 21, "CountryName" : "US" } { "_id" : ObjectId("5e2bd3e571bf0181ecc42283"), "Name" : "Chris", "Age" : 23, "CountryName" : "UK" } { "_id" : ObjectId("5e2bd3e571bf0181ecc42284"), "Name" : "Chris", "Age" : 23, "CountryName" : "UK" } { "_id" : ObjectId("5e2bd3e571bf0181ecc42285"), "Name" : "Chris", "Age" : 21, "CountryName" : "AUS" } { "_id" : ObjectId("5e2bd3e571bf0181ecc42286"), "Name" : "Chris", "Age" : 21, "CountryName" : "AUS" } { "_id" : ObjectId("5e2bd3e571bf0181ecc42287"), "Name" : "Chris", "Age" : 23, "CountryName" : "AUS" } { "_id" : ObjectId("5e2bd3e571bf0181ecc42288"), "Name" : "Chris", "Age" : 21, "CountryName" : "UK" }
以下是实现多级$group的查询-
> db.demo76.aggregate([ ... { "$match": { "Name": "Chris" }}, ... { "$group": { ... "_id": { "Age": "$Age", "CountryName": "$CountryName" }, ... "count": { "$sum": 1 } ... }}, ... { "$group": { ... "_id": "$_id.Age", ... "CountryName": { ... "$push": { ... "k": "$_id.CountryName", ... "v": "$count" ... } ... } ... }}, ... { "$addFields": { ... "CountryName": { ... "$arrayToObject": "$CountryName" ... } ... }} ... ]);
这将产生以下输出-
{ "_id" : 23, "CountryName" : { "AUS" : 1, "UK" : 2 } } { "_id" : 21, "CountryName" : { "UK" : 1, "AUS" : 2, "US" : 2 } }