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.