Những gì bạn cần ở đây là một giá trị "khóa duy nhất" được tạo cho mỗi tổ hợp "người gửi và người nhận". Nếu bạn muốn làm điều này một cách thường xuyên thì tôi khuyên bạn nên lưu trữ giá trị trong tài liệu. Nhưng đây là một cách bạn có thể thoát khỏi vấn đề bằng cách sử dụng khung tổng hợp:
db.messages.aggregate([
{ "$project": {
"combined": { "$map": {
"input": { "$literal": ["A","B"] },
"as": "bin",
"in": { "$cond": [
{ "$eq": [ "$$bin", "A" ] },
"$sender",
"$recipient"
]}
}},
"doc": "$$ROOT"
}},
{ "$unwind": "$combined" },
{ "$sort": { "_id": 1, "combined": 1, "doc.date": -1 } },
{ "$group": {
"_id": "$_id",
"combined": { "$push": "$combined" },
"doc": { "$first": "$doc" }
}},
{ "$group": {
"_id": "$combined",
"doc": { "$first": "$doc" }
}}
])
Điều đó thu hẹp mẫu của bạn thành 3 kết hợp "duy nhất" trên "người gửi / người nhận" và trả về tài liệu cuối cùng trong cuộc hội thoại giữa "cặp" đó:
{
"_id" : [
"52f37fbaf9cd0e02773c97b1",
"53172480f9cd0e682840b9f7"
],
"doc" : {
"_id" : "54b4cec9f6a48ce34f8b6429",
"date" : NumberLong(1421135561),
"sender" : "53172480f9cd0e682840b9f7",
"recipient" : "52f37fbaf9cd0e02773c97b1",
"isRead" : false,
"text" : "Hello 2!"
}
}
{
"_id" : [
"52f37fbaf9cd0e02773c97b1",
"53072122f9cd0ee76306dc5a"
],
"doc" : {
"_id" : "54b4cf02f6a48ce54f8b62f9",
"date" : NumberLong(1421135618),
"sender" : "53072122f9cd0ee76306dc5a",
"recipient" : "52f37fbaf9cd0e02773c97b1",
"isRead" : false,
"text" : "Hello 3!"
}
}
{
"_id" : [
"52ea178ff9cd0e9f24d776b4",
"52f37fbaf9cd0e02773c97b1"
],
"doc" : {
"_id" : "54b4d249f6a48ce54f8b6b9f",
"date" : NumberLong(1421136457),
"sender" : "52f37fbaf9cd0e02773c97b1",
"recipient" : "52ea178ff9cd0e9f24d776b4",
"isRead" : false,
"text" : "Hello 4!"
}
}