Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Truy vấn MongoDB chọn distinct và đếm số lần xuất hiện

Sử dụng aggregation pipeline phức tạp: $unwind → $group cấp 1 (theo Name+Marks) → $group cấp 2 (theo Name, gom Marks duy nhất với $addToSet) → $project. Tạo collection:

> db.demo586.insertOne({ "details": [ { "Name":"Chris", "Marks":71 }, { "Name":"Chris", "Marks":61 }, { "Name":"David", "Marks":81 } ] });
{ "acknowledged" : true, "insertedId" : ObjectId("5e9200fefd2d90c177b5bcc7") }
> db.demo586.insertOne({ "details": [ { "Name":"Chris", "Marks":71 }, { "Name":"Carol", "Marks":61 }, { "Name":"David", "Marks":81 } ] });
{ "acknowledged" : true, "insertedId" : ObjectId("5e9200fefd2d90c177b5bcc8") }

Hiển thị dữ liệu (2 tài liệu, mảng details):

> db.demo586.find();

Pipeline đầy đủ:

> var q = [
...   { "$unwind": "$details" },
...   { "$group": { "_id": { "Name": "$details.Name", "Marks": "$details.Marks" }, "count": { "$sum": 1 } } },
...   { "$group": { "_id": "$_id.Name", "distinctV": { "$addToSet": { "value": "$_id.Marks", "numberOfValues": "$count" } } } },
...   { "$project": { "_id": 0, "Name": "$_id", "distinctV": 1 } }
... ];
> db.demo586.aggregate(q);

Kết quả (Marks duy nhất mỗi Name kèm số lần xuất hiện):


Giải thích: Chris có Marks 71 xuất hiện 2 lần (2 tài liệu), 61 xuất hiện 1 lần. Carol chỉ có 61 (1 lần). David có 81 (2 lần).