[英]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.