Yang Anda butuhkan di sini adalah nilai "kunci unik" yang dihasilkan untuk setiap kombinasi "pengirim dan penerima". Jika Anda ingin melakukan ini secara teratur maka saya sarankan menyimpan nilai dalam dokumen. Tapi ini adalah cara Anda bisa keluar dari masalah menggunakan kerangka kerja agregasi:
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" }
}}
])
Itu mempersempit sampel Anda menjadi 3 kombinasi "unik" pada "pengirim / penerima" dan mengembalikan dokumen terakhir dalam percakapan antara "pasangan" itu:
{
"_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!"
}
}