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

Bagaimana cara memperbarui beberapa bidang objek array dengan satu permintaan?

Anda perlu menyediakan beberapa kunci ke $set dengan posisi $ operator untuk memperbarui kedua kunci yang cocok.

Saya lebih suka cara manipulasi objek ES6 modern:

let params = { "_id" : "xxxproductid", "name" : "xxx", "img" : "yyy" };

let update = [
  { 'store.products._id': params._id },
  { "$set": Object.keys(params).filter(k => k != '_id')
    .reduce((acc,curr) =>
      Object.assign(acc,{ [`store.products.$.${curr}`]: params[curr] }),
    { })
  }
];

User.update(...update,callback);

Yang akan menghasilkan panggilan ke MongoDB sebagai ( dengan mongoose.set('debug', true) ) diaktifkan sehingga kami melihat permintaan:

Di mana pada dasarnya Anda mengambil params masukan Anda dan berikan _id sebagai argumen pertama untuk "query" :

  { 'store.products._id': params._id },

Sisanya mengambil "kunci" dari objek melalui Object.keys yang membuat "array" yang dapat kita "filter" dengan Array.filter() lalu teruskan ke Array.reduce untuk mengubah kunci tersebut menjadi Object .

Di dalam .reduce() kami memanggil Object.assign() yang "menggabungkan" objek dengan kunci yang diberikan, dibuat dalam bentuk ini:

  Object.assign(acc,{ [`store.products.$.${curr}`]: params[curr] }),

Menggunakan sintaks template untuk menetapkan "saat ini" (curr) "kunci" ke dalam nama kunci baru, sekali lagi menggunakan Sintaks penetapan kunci ES6 []: yang memungkinkan nama variabel dalam literal objek.

Objek "gabungan" yang dihasilkan diteruskan kembali untuk ditetapkan ke objek "root" di mana $set digunakan untuk kunci pembaruan, jadi kunci yang "dihasilkan" sekarang adalah turunannya.

Saya menggunakan array untuk argumen murni untuk tujuan debugging, tetapi kemudian itu juga memungkinkan sintaks yang lebih bersih pada .update() yang sebenarnya menggunakan "spread" ... operator untuk menetapkan argumen:

User.update(...update,callback);

Bersih dan sederhana, dan beberapa teknik JavaScript yang harus Anda pelajari untuk manipulasi objek dan array. Sebagian besar karena permintaan MongoDB DSL pada dasarnya adalah "Objek" dan "Array". Jadi belajarlah untuk memanipulasi mereka.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Menghapus banyak ke banyak referensi di Mongoose

  2. Apa yang salah dengan MongoDB menghapus kueri menggunakan mongodb Java untuk sub-array dokumen?

  3. 'Gagal memutuskan tautan kesalahan file soket di MongoDB 3.0

  4. Hubungkan mongo db ke nodejs server jauh

  5. Dapatkan bagian tertentu dari dokumen