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.