Chúng ta có thể sử dụng khung tổng hợp để làm điều này. Trước tiên, chúng ta cần $sort
bởi user
và "_id". Từ đó, chúng tôi $group
bởi "người dùng" và sử dụng $last
toán tử tích lũy để trả về tài liệu cuối cùng cho mỗi người dùng. Lưu ý rằng chúng tôi cũng có thể sử dụng $first
toán tử tích lũy nếu chúng tôi sắp xếp tài liệu của mình theo thứ tự giảm dần, nhưng sắp xếp theo thứ tự tăng dần và sử dụng $last
làm cho ý định của chúng tôi rõ ràng.
db.collection.aggregate([
{ "$sort": { "user": 1, "_id": -1 } },
{ "$group": {
"_id": "$user",
"user": { "$last": "$$ROOT" }
}}
])
nơi sản xuất:
{
"_id" : "fje93jrg4",
"user" : {
"_id" : 2,
"user" : "fje93jrg4",
"event" : null,
"group" : null,
"name" : "Bob",
"text" : "Testing"
}
}
{
"_id" : "94fg844f",
"user" : {
"_id" : 1,
"user" : "94fg844f",
"event" : null,
"group" : null,
"name" : "Jake",
"text" : "Hello world"
}
}
{
"_id" : null,
"user" : {
"_id" : 4,
"user" : null,
"event" : "d0j3n9fn3",
"group" : null,
"name" : "My Event",
"text" : "Testing 2"
}
}
Chúng tôi có thể muốn thêm một $project
cho đường ống của chúng tôi nhưng làm như vậy sẽ gây ra giảm hiệu suất. Tuy nhiên, nó sẽ giảm cả lượng dữ liệu được gửi qua dây cũng như thời gian và bộ nhớ được sử dụng để giải mã tài liệu ở phía máy khách nếu không cần tất cả các cặp khóa / giá trị trong tài liệu được trả về.
$project
sân khấu trông như thế này:
{ "$project": {
"_id": "$user._id",
"user": "$user.user",
"event": "$user.event",
"group": "$user.group",
"name": "$user.name",
"text": "$user.text"
}}