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

penyortiran subdokumen luwak

Saya bisa saja menuliskan ini sebagai beberapa hal, tetapi dengan pertimbangan "mendapatkan kembali objek luwak" tampaknya menjadi pertimbangan utama.

Jadi ada berbagai hal yang "bisa" Anda lakukan. Tetapi karena Anda "mengisi referensi" ke dalam Obyek dan kemudian ingin mengubah urutan objek dalam array, hanya ada satu cara untuk memperbaikinya sekali dan untuk selamanya.

Perbaiki data sesuai urutan yang Anda buat

Jika Anda ingin larik "komentar" Anda diurutkan berdasarkan tanggal "dibuat_at", ini bahkan dapat dipecah menjadi beberapa kemungkinan:

  1. Itu "seharusnya" ditambahkan dalam urutan "penyisipan", jadi "terbaru" adalah yang terakhir seperti yang Anda perhatikan, tetapi Anda juga dapat "memodifikasi" ini dalam versi MongoDB baru-baru ini (beberapa tahun terakhir sekarang) dengan $position sebagai pengubah $push :

    Article.update(
        { "_id": articleId },
        { 
            "$push": { "comments": { "$each": [newComment], "$position": 0 } }
        },
        function(err,result) {
            // other work in here
        }
    );
    

    Ini "mendahulukan" elemen larik ke larik yang ada pada indeks "pertama" (0) sehingga selalu di depan.

  2. Gagal menggunakan pembaruan "posisional" karena alasan logis atau hanya di mana Anda "ingin memastikan", maka telah ada untuk waktu yang "lebih lama" $sort pengubah ke $push :

    Article.update(
        { "_id": articleId },
        { 
            "$push": { 
                "comments": { 
                    "$each": [newComment], 
                    "$sort": { "$created_at": -1 } 
                }
            }
        },
        function(err,result) {
            // other work in here
        }
    );
    

    Dan itu akan "mengurutkan" pada properti dokumen elemen array yang berisi nilai yang ditentukan pada setiap modifikasi. Anda bahkan dapat melakukan:

    Article.update(
        {  },
        { 
            "$push": { 
                "comments": { 
                    "$each": [], 
                    "$sort": { "$created_at": -1 } 
                }
            }
        },
        { "multi": true },
        function(err,result) {
            // other work in here
        }
    );
    

    Dan itu akan mengurutkan setiap larik "komentar" di seluruh koleksi Anda menurut bidang yang ditentukan dalam satu klik.

Solusi lain dimungkinkan menggunakan .aggregate() untuk mengurutkan larik dan/atau "mencetak ulang" ke objek luwak setelah Anda melakukan operasi itu atau setelah melakukan .sort() Anda sendiri pada objek polos.

Keduanya benar-benar melibatkan pembuatan objek model terpisah dan "skema" dengan item yang disematkan termasuk informasi "direferensikan". Jadi, Anda dapat mengerjakan baris-baris itu, tetapi tampaknya menjadi overhead yang tidak perlu ketika Anda hanya bisa mengurutkan data menurut Anda "paling dibutuhkan" berarti di tempat pertama.

Alternatifnya adalah memastikan bahwa bidang seperti "virtual" selalu "berseri" ke dalam format objek dengan .toObject() on call dan hidup dengan kenyataan bahwa semua metode sekarang hilang dan bekerja dengan properti seperti yang disajikan.

Yang terakhir adalah pendekatan "waras", tetapi jika yang biasanya Anda gunakan adalah urutan "created_at", maka jauh lebih masuk akal untuk "menyimpan" data Anda seperti itu dengan setiap operasi sehingga ketika Anda "mengambilnya", data itu tetap berada di urutan yang akan Anda gunakan.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Buat skrip untuk membuat koleksi MongoDB dari Mongo shell?

  2. MongoDB findOneAndReplace()

  3. Cara Memeriksa Tipe Data Kolom di SQL

  4. Bantu Menentukan Alat GUI MongoDB yang Luar Biasa

  5. Bagaimana saya bisa menggunakan regex di mongodb di atas mongolab?