Trường hợp cơ bản ở đây là sử dụng .aggregate()
với $unwind
bởi vì bạn cần quyền truy cập vào các giá trị trong mảng làm khóa nhóm của mình và tất nhiên là $group
bởi vì đó là cách bạn "nhóm" mọi thứ:
db.collection.aggregate([
{ "$match": { "auctionId": 22 } },
{ "$unwind": "$itmLst" },
{ "$group": {
"_id": "$itmLst.category",
"count": { "$sum": 1 }
}}
])
Điều này sẽ cung cấp cho bạn kết quả như:
{ "_id": "ANTIQUES", "count": 56 }
{ "_id": "TOOLS", "count": 89 }
{ "_id": "JEWLRY", "count": 45 }
Bây giờ bạn thực sự nên học cách sống chung với điều đó, bởi vì một "danh sách" ở định dạng con trỏ mặc định là một điều tốt và có thể lặp lại một cách tự nhiên. Ngoài ra, các khóa có tên IMHO không tự nhiên cho phép bản trình bày dữ liệu và bạn thường muốn có một thuộc tính chung trong danh sách có thể lặp lại.
Nếu bạn thực sự có ý định sử dụng đầu ra các khóa có tên số ít, thì bạn sẽ cần MongoDB 3.4.4 trở lên để có quyền truy cập vào $arrayToObject
điều đó sẽ cho phép bạn sử dụng các giá trị làm tên của khóa và tất nhiên $replaceRoot
để sử dụng kết quả biểu thức đó làm tài liệu mới để tạo:
db.collection.aggregate([
{ "$match": { "auctionId": 22 } },
{ "$unwind": "$itmLst" },
{ "$group": {
"_id": "$itmLst.category",
"count": { "$sum": 1 }
}},
{ "$group": {
"_id": null,
"data": { "$push": { "k": "$_id", "v": "$count" } }
}},
{ "$replaceRoot": {
"newRoot": {
"$arrayToObject": "$data"
}
}}
])
Hoặc nếu bạn không có tùy chọn đó, thì thay vào đó, bạn nên chuyển đổi đầu ra con trỏ trong mã:
db.collection.aggregate([
{ "$match": { "auctionId": 22 } },
{ "$unwind": "$itmLst" },
{ "$group": {
"_id": "$itmLst.category",
"count": { "$sum": 1 }
}}
]).toArray().reduce((acc,curr) =>
Object.assign(acc,{ [curr._id]: curr.count }),
{}
)
Cả hai hợp nhất thành một đối tượng duy nhất với các khóa được đặt tên từ kết quả tổng hợp ban đầu:
{
"ANTIQUES": 56,
"TOOLS": 89,
"JEWLRY": 45,
...
}
Và điều đó cho thấy rằng kết quả đầu ra ban đầu đã thực sự đủ và thông thường bạn muốn loại "định hình lại lần cuối" đó được thực hiện trong mã sử dụng đầu ra con trỏ, nếu bạn thực sự cần định dạng lại từ cơ bản dữ liệu cần thiết vẫn được trả lại.