Dokumen "terbaru" Anda akan selalu berada di akhir array Anda kecuali Anda memodifikasinya. Menambahkan item ke dalam array akan selalu mengarah ke "akhir" atau "tambahkan" ke item yang ada saat digunakan dengan $push
operator atau ditambahkan menggunakan metode manipulasi array dalam kode klien.
Hanya operator seperti $addToSet
atau secara eksplisit menggunakan pengubah ke $push
operasi akan mengubah ini.
Dengan demikian, ketika di akhir array, yang biasanya ingin Anda lakukan adalah menggunakan $slice
, dengan indeks negatif untuk mendapatkan item dari "akhir" larik:
Model.findById("55d3a39565698bbc68079e31")
.select({ "comments": { "$slice": -1 }})
.exec(function(err,doc) {
})
Jika Anda benar-benar telah memodifikasi array seperti yang disebutkan sebelumnya di mana tanggal terbaru bukan elemen terakhir dalam array maka Anda harus menggunakan $sort
pengubah pada pembaruan. Biasanya hanya "tidak pada tempatnya" jika Anda meminta $position
pengubah atau Anda menggunakan $addToSet
. $position
akan disengaja dan Anda juga tidak dapat mengurutkan, tetapi Anda selalu dapat mengurutkan array setelah $addToSet
operasi seperti ini, yang menempatkan semua tanggal secara berurutan tanpa mengubah konten array lainnya:
Model.findByIdAndUpdate("55d3a39565698bbc68079e31",
{ "$push": { "comments": { "$each": [], "$sort": { "date": 1 } } } }
)
Dengan array yang dimodifikasi $slice
. yang sama operasi berlaku untuk kueri karena larik sekarang diurutkan berdasarkan tanggal.
Namun jika niat Anda adalah membiarkan array di dokumen Anda rusak, atau dalam urutan lain yang Anda inginkan, tetapi Anda juga ingin mendapatkan tanggal terbaru, maka Anda dapat menggunakan .aggregate()
ke $sort
dan ambil $last
entri larik:
Model.aggregate(
[
{ "$match": { "_id": ObjectID("55d3a39565698bbc68079e31") } },
{ "$unwind": "$comments" },
{ "$sort": { "comments.date": 1 } },
{ "$group": {
"_id": "$_id",
"author": { "$first": "$author" },
"link": { "$first": "$link" },
"title": { "$first": "$title" },
"date": { "$first": "$date" },
"comments": { "$last": "$comments" }
}}
]
)
Perhatikan bahwa saat menggunakan kerangka kerja agregasi dengan luwak, _id
"autocasting" yang terjadi di kueri lain tidak terjadi (ini adalah desain), jadi perlu dilemparkan ke ObjectId
nilai sendiri, jika data belum tersedia dalam bentuk itu dan telah masuk sebagai string.
Itulah cara Anda mendapatkan elemen terakhir ( diurutkan secara eksplisit secara opsional ) dari sebuah array.