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

Daftar MongoDB - dapatkan setiap item ke-N

Tampaknya pertanyaan Anda dengan jelas menanyakan "dapatkan setiap contoh ke-n" yang tampaknya merupakan pertanyaan yang cukup jelas.

Operasi kueri seperti .find() benar-benar hanya dapat mengembalikan dokumen "sebagaimana adanya" dengan pengecualian bidang "seleksi" umum dalam proyeksi dan operator seperti posisi $ operator pertandingan atau $elemMatch yang memungkinkan elemen larik tunggal yang cocok.

Tentu saja ada $slice , tetapi itu hanya memungkinkan "pemilihan rentang" pada larik, jadi sekali lagi tidak berlaku.

Hal "hanya" yang dapat mengubah hasil di server adalah .aggregate() dan .mapReduce() . Yang pertama tidak "bermain sangat baik" dengan array "slicing" dengan cara apa pun, setidaknya tidak dengan elemen "n". Namun karena argumen "function()" dari mapReduce adalah logika berbasis JavaScript, maka Anda memiliki lebih banyak ruang untuk dimainkan.

Untuk proses analitis, dan untuk tujuan analitis "hanya" maka cukup filter konten array melalui mapReduce menggunakan .filter() :

db.collection.mapReduce(
    function() {
        var id = this._id;
        delete this._id;

        // filter the content of "instances" to every 3rd item only
        this.instances = this.instances.filter(function(el,idx) {
            return ((idx+1) % 3) == 0;
        });
        emit(id,this);
    },
    function() {},
    { "out": { "inline": 1 } } // or output to collection as required
)

Ini benar-benar hanya "pelari JavaScript" pada saat ini, tetapi jika ini hanya untuk analisis/pengujian maka secara umum tidak ada yang salah dengan konsep tersebut. Tentu saja outputnya tidak "persis" bagaimana struktur dokumen Anda, tapi itu sedekat faksimili seperti yang bisa didapatkan mapReduce.

Saran lain yang saya lihat di sini memerlukan pembuatan koleksi baru dengan semua item "dinormalisasi" dan memasukkan "indeks" dari array sebagai bagian dari _id unqique kunci. Itu mungkin menghasilkan sesuatu yang dapat Anda kueri secara langsung, tetapi untuk "setiap item ke-n" Anda masih harus melakukan:

db.resultCollection.find({
     "_id.index": { "$in": [2,5,8,11,14] } // and so on ....
})

Jadi kerjakan dan berikan nilai indeks "setiap item ke-n" untuk mendapatkan "setiap item ke-n". Jadi sepertinya itu tidak menyelesaikan masalah yang ditanyakan.

Jika formulir keluaran tampak lebih diinginkan untuk tujuan "pengujian" Anda, maka kueri selanjutnya yang lebih baik pada hasil tersebut akan menggunakan pipa agregasi, dengan $redact

db.newCollection([
    { "$redact": {
        "$cond": {
            "if": {
                "$eq": [ 
                    { "$mod": [ { "$add": [ "$_id.index", 1] }, 3 ] },
                0 ]
            },
            "then": "$$KEEP",
            "else": "$$PRUNE"
        }
    }}
])

Itu setidaknya menggunakan "kondisi logis" yang sama seperti yang diterapkan dengan .filter() sebelumnya hanya memilih item "nth index" tanpa mencantumkan semua kemungkinan nilai indeks sebagai argumen kueri.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bagaimana saya bisa menghitung hari ini berdasarkan bulan di laravel?

  2. Bagaimana cara saya mendapatkan Tanggal untuk disimpan sebagai Tanggal di MongoDB alih-alih Int64?

  3. Saya mendapatkan kesalahan saat menggunakan aplikasi Node.Js dengan mongoDB di Elastic Beanstalk

  4. g++ tidak dapat menautkan statis libmongcxx(r3.0.2) tetapi tautan dinamis berfungsi

  5. Gunakan agregasi di mongodb untuk melakukan pembaruan setelah kueri cocok