Kami tidak dapat menggunakan $type
operator untuk memfilter dokumen kami di sini karena jenis elemen dalam array kami adalah "string" dan seperti yang disebutkan dalam dokumentasi:
Tapi untungnya MongoDB juga menyediakan $exists operator yang dapat digunakan di sini dengan indeks array numerik.
Sekarang bagaimana kita bisa memperbarui dokumen-dokumen itu?
Nah, dari MongoDB versi <=3.2, satu-satunya pilihan yang kita miliki adalah mapReduce()
tetapi pertama-tama mari kita lihat alternatif lain dalam rilis MongoDB yang akan datang.
Mulai dari MongoDB 3.4, kita dapat $project
dokumen kami dan gunakan $split operator untuk membagi string kita menjadi larik substring.
Perhatikan bahwa untuk memisahkan hanya "tag" yang berupa string, kita memerlukan logika $cond
pemrosesan ition untuk membagi hanya nilai-nilai yang berupa string. Syaratnya di sini adalah $eq
yang mengevaluasi ke true ketika $type bidang sama dengan "string" . Omong-omong $type di sini baru di 3.4.
Akhirnya kita dapat menimpa koleksi lama menggunakan $out
operator tahap pipa. Tetapi kita perlu secara eksplisit menentukan penyertaan bidang lain dalam $project panggung .
db.collection.aggregate(
[
{ "$project": {
"tags": {
"$cond": [
{ "$eq": [
{ "$type": "$tags" },
"string"
]},
{ "$split": [ "$tags", " " ] },
"$tags"
]
}
}},
{ "$out": "collection" }
]
)
Dengan mapReduce , kita perlu menggunakan Array.prototype.split()
untuk memancarkan larik substring di fungsi peta our . Kita juga perlu memfilter dokumen kita menggunakan opsi "query". Dari sana kita perlu mengulang array "results" dan $set nilai baru untuk "tag" menggunakan operasi massal menggunakan bulkWrite()
metode baru di 3.2 atau Bulk() yang sekarang tidak digunakan lagi
jika kita menggunakan 2.6 atau 3.0 seperti yang ditunjukkan di sini.
db.collection.mapReduce(
function() { emit(this._id, this.tags.split(" ")); },
function(key, value) {},
{
"out": { "inline": 1 },
"query": {
"tags.0": { "$exists": false },
"tags": { "$type": 2 }
}
}
)['results']