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

Mengubah beberapa bidang di Mongo dari String ke Array

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



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongodb mengambil koleksi dengan driver java

  2. Dapatkan semua nama bidang dalam koleksi mongodb?

  3. Bagaimana cara mendapatkan objek Node saat menggunakan Neo4j jdbc?

  4. Mongo berhenti bekerja setelah memutakhirkan

  5. Berurusan dengan mongodb unik, jarang, indeks majemuk