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']