繁体   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