簡體   English   中英

貓鼬更新多個子文檔

[英]Mongoose update multiple subdocuments

我正在嘗試更新一個子文檔addresses (工作),然后更新除上一個子文檔以外的許多子文檔。 基本上每一個時間address變更is_preferred為true,就必須更新,以前的地址is_preferredtruefalse (我想通知大家,除了改為真正的地址)。

用戶文件

 _id: ObjectId("5b996f0fd5fbf511709f668f"); addresses: [ { _id: ObjectId("5ba33e0991cd7a3bb85dab7e"); is_preferred:true }, { _id: ObjectId("5ba3e9337310c637207b44cb"); is_preferred:false } ] 

這是我的解決方案:

 // model User = mongoose.model('user', new Schema({ _id: { type: mongoose.Schema.Types.ObjectId, required: true }, addresses: [ { _id: { type: mongoose.Schema.Types.ObjectId, required: true }, is_preferred: { type: Boolean, required: true } } ], }, { collection: 'user' });); // route router.put('/updateAddress/:addressId', auth, user.updateAddress); // user.js exports.updateAddress = wrap(async(req, res, next) => { // update one object address `is_preferred` to true and return an array 'addresses' containing it const user = await User.findOneAndUpdate( { addresses: { $elemMatch: { _id: mongoose.Types.ObjectId(req.params.addressId) } } }, { 'addresses.$': req.body }, { projection: { addresses: { $elemMatch: { _id: mongoose.Types.ObjectId(req.params.addressId) } } }, new: true }).lean(); if (user) { // updated object `is_preferred` changed to true, so another objects must be false if (user.addresses[0].is_preferred) { // doesnt work await User.update({ _id: { $ne: mongoose.Types.ObjectId(req.params.addressId) }, is_preferred: true }, { $set: { addresses: { is_preferred: false } } }, { multi: true }); } res.status(200).json({success: true, message: 'Saved.', new_object: user.addresses[0]}); } else { res.status(400).json({success: false, message: 'Error.'}); } }); 

我能夠更新user子文檔addresses is_preferredtrue 但是,將另一個addresses is_preferredfalse不能正常工作。 我究竟做錯了什么?

我建議像您這樣的場景使用貓鼬中間件prepost模式掛鈎。 這個想法是,與其在您的控制器中處理該問題,不如通過該中間件在您的模式中進行處理。

唯一的不便之處是, prepost掛鈎不會在findOneAndUpdatefindOneAndUpdate ,您需要先執行find然后進行update

因此,您可以對post掛鈎執行以下操作:

User.post('save', doc => {
  // You can update all the rest of the addresses here.
});

另外,為了使更新生效,您需要執行以下操作:

User.update(
   { "addresses._id": { $ne: mongoose.Types.ObjectId(req.params.addressId) }}, 
   { $set: { 'addresses.0.is_preferred': false }}, 
   { multi: true }
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM