MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Bagaimana cara mengambil objek terakhir array dalam dokumen yang disematkan di Mongoose?

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.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Menghubungkan ke DocumentDB dari AWS Lambda menggunakan Python

  2. Bagaimana cara memperbaiki masalah pemetaan Morphia ini??? ---> PERINGATAN [org.mongodb.morphia.mapping.DefaultCreator] - Kelas tidak ditemukan didefinisikan dalam dbObj:

  3. GALAT:Tidak dapat menulis file pid ke /var/run/mongodb/mongod.pid:Tidak ada file atau direktori seperti itu inf fedora 20

  4. Driver PHP72 MongoDB dengan Homebrew di OSX

  5. Memfaktorkan ulang kode middleware proyek NodeJS, menggunakan rute, pengontrol, dan model