[英]Mongoose update multiple subdocuments
我正在嘗試更新一個子文檔addresses
(工作),然后更新除上一個子文檔以外的許多子文檔。 基本上每一個時間address
變更is_preferred
為true,就必須更新,以前的地址is_preferred
是true
到false
(我想通知大家,除了改為真正的地址)。
用戶文件
_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_preferred
為true
。 但是,將另一個addresses
is_preferred
為false
不能正常工作。 我究竟做錯了什么?
我建議像您這樣的場景使用貓鼬中間件pre
或post
模式掛鈎。 這個想法是,與其在您的控制器中處理該問題,不如通過該中間件在您的模式中進行處理。
唯一的不便之處是, pre
和post
掛鈎不會在findOneAndUpdate
上findOneAndUpdate
,您需要先執行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.