Den bedste måde at gøre dette på er at bruge aggregeringsrammen. Du skal $group
dine dokumenter efter "bruger" og returner det sidste dokument for hver bruger ved hjælp af $last
akkumulator operatør, men for at dette skal fungere, skal du bruge et foreløbigt sorteringstrin ved hjælp af $sort
aggregeringsrørledningsoperatør. For at sortere dine dokumenter skal du overveje både feltet "createdAt" og feltet "bruger".
Det sidste trin i pipelinen er $match
trin, hvor du kun vælger de sidste dokumenter, hvor "isAbandoned" er lig med true
.
db.students.aggregate([
{ "$sort": { "user": 1, "createdAt": 1 } },
{ "$group": {
"_id": "$user",
"last": { "$last": "$$ROOT" }
}},
{ "$match": { "last.isAbandoned": true } }
])
som returnerer noget som dette:
{
"_id" : ObjectId("56c85244bd5f92cd78ae4bc1"),
"last" : {
"_id" : ObjectId("56cee51503b7cb7b0eda9c4c"),
"user" : ObjectId("56c85244bd5f92cd78ae4bc1"),
"studentName" : "Rajeev",
"createdAt" : ISODate("2016-02-25T11:27:17.281Z"),
"isAbandoned" : true
}
}
For at få det forventede resultat skal vi bruge $replaceRoot
pipeline-operatør fra version 3.4 for at fremme det indlejrede dokument til det øverste niveau
{
$replaceRoot: { newRoot: "$last" }
}
I ældre version skal du bruge $project
aggregeringspipeline-operation for at omforme vores dokumenter. Så hvis vi udvider vores pipeline med følgende fase:
{
"$project": {
"_id": "$last._id",
"user": "$last.user",
"studentName": "$last.studentName",
"createdAt": "$last.createdAt",
"isAbandoned": "$last.isAbandoned"
}}
det producerer det forventede output:
{
"_id" : ObjectId("56cee51503b7cb7b0eda9c4c"),
"user" : ObjectId("56c85244bd5f92cd78ae4bc1"),
"studentName" : "Rajeev",
"createdAt" : ISODate("2016-02-25T11:27:17.281Z"),
"isAbandoned" : true
}