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

Sisipkan Array di Dokumen yang ada

Ada beberapa hal yang salah dalam kode Anda di sini. Pertama dan terpenting yang perlu diperhatikan adalah bahwa Anda sedang berjalan di lingkungan "async" sekarang dan Anda perlu mengubah pemikiran tentang cara Anda melakukan beberapa hal.

Kode PHP Anda sebelumnya adalah "blocking", yang berarti bahwa setiap baris kode harus diselesaikan sebelum pindah ke baris kode berikutnya. Ini termasuk menunggu server database melakukan pembaruan dan mengembalikan respons.

Anda tidak dapat menggunakan loop kontrol dasar dengan fungsi di dalamnya yang bekerja secara asinkron. Alih-alih, Anda memerlukan sesuatu yang dapat memanggil iterasi berikutnya dari loop (atau setidaknya memberi sinyal bahwa satu iterasi selesai) setelah fungsi asinkron "pembaruan" benar-benar mengembalikan hasil.

Poin kedua di sini adalah "tidak ada yang diperbarui" karena Anda tidak memberi tahu fungsi apa yang harus diperbarui atau dengan apa memperbarui dokumen yang cocok.

Berikut ini analog dengan daftar PHP asli Anda, tetapi disesuaikan untuk metode "async" juga menggunakan async.eachSeries untuk kontrol loop dari async perpustakaan:

async.eachSeries(
    tables,
    function(table,callback) {
        var tablename  = table.tablename;
        delete table.tablename;   // just remove the key rather than re-construct
        OutAccept.update(
            { "tablename": tablename },
            { "$push": { "inventar": table } },
            function(err,numAffected) {
                console.log( numAfftected ); // tells you how many are updated or nothing
                callback(err)
            }
        );
    },
    function(err) {
       // comes here on completion of all array items
    }
);

.findOneAndUpdate() command sebagai gantinya mengembalikan dokumen yang telah dimodifikasi dan dengan modifikasi hanya jika Anda memintanya dengan { "new": true }

async.eachSeries(
    tables,
    function(table,callback) {
        var tablename  = table.tablename;
        delete table.tablename;
        OutAccept.findOneAndUpdate(
            { "tablename": tablename },
            { "$push": { "inventar": table } },
            { "new": true },
            function(err,doc) {
                console.log( doc ); // shows the modified document
                callback(err)
            }
        );
    },
    function(err) {
       // comes here on completion of all array items
    }
);

Jika Anda ingin menambahkan Beberapa elemen array sekaligus, atau jika Anda memiliki satu elemen secara langsung dalam array, gunakan $each pengubah ke $push :

var inventor =  [
    {
        "ean": "2",
        "name": "name2",
        "runtime": "0",
        "art": "null",
        "marker": "null",
        "stammkost": "null",
        "accepted": "0"
    },
    {
        "ean": "1",
        "name": "name1",
        "runtime": "0",
        "art": "null",
        "marker": "null",
        "stammkost": "null",
        "accepted": "0"
    }
];


OutAccept.update(
    { "tablename": tablename },
    { "$push": { "inventar": { "$each": inventar } } },
    function(err,numAffected) {
       // work in here
    }
);



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. rotasi log mongo tidak berfungsi di windows

  2. Upsert tidak berfungsi untuk updateOne bulkWrite v3.4

  3. Bagaimana cara membungkus axios.get beberapa hasil respons ke dalam satu larik?

  4. Bagaimana ObjectIds MongoDB dihasilkan?

  5. Persentase kondisi ATAU yang cocok di mongodb