我在用.pull
从 mongo db 中的数组中删除一条记录,它工作得很好,但是我在堆栈溢出的某个地方读到的一条评论(无法再次找到它来发布链接)让我很困扰,因为它评论说它不好用.save
而不是使用.findByIdAndUpdate
or .updateOne
我只是想知道这是否准确或主观。
我目前就是这样做的。我检查具有该 id 的产品是否确实存在,如果存在,我从数组中提取该记录。
exports.deleteImg = (req, res, next) => {
const productId = req.params.productId;
const imgId = req.params.imgId;
Product.findById(productId)
.then(product => {
if (!product) {
return res.status(500).json({ message: "Product not found" });
} else {
product.images.pull(imgId);
product.save()
.then(response => {
return res.status(200).json( { message: 'Image deleted'} );
})
}
})
.catch(err => {
console.log(err);
});
};
我认为他们所说的是应该这样做(我在谷歌后找到的一个例子)
users.findByIdAndUpdate(userID,
{$pull: {friends: friend}},
{safe: true, upsert: true},
function(err, doc) {
if(err){
console.log(err);
}else{
//do stuff
}
}
);
主要区别在于,当您使用findById
and save
,您首先从 MongoDB 获取对象,然后更新您想要的任何内容,然后保存。当您不需要担心并行性或对同一对象的多个查询时,这是可以的。
findByIdAndUpdate
是原子的。当您多次执行此操作时,MongoDB 将为您处理并行性。按照您的示例,如果同时对同一对象发出两个请求,则传递{ $pull: { friends: friendId } }
,结果将是预期的:只会从数组中拉出一个朋友。
但假设你在这个物体上有一个计数器,比如friendsTotal
起始值为 0。对于同一个对象,您到达的端点必须将计数器增加一两次。
如果你使用findById
,然后增加,然后save
,你会遇到一些问题,因为你正在设置整个值。因此,您首先获取对象,增加到 1,然后更新。但另一个请求也做了同样的事情。你最终会得到friendsTotal = 1
.
With findByIdAndUpdate
你可以用{ $inc: { friendsTotal: 1 } }
。因此,即使您在同一时间对同一个对象执行此查询两次,您最终也会得到friendsTotal = 2
,因为 MongoDB 使用这些更新运算符来更好地处理并行性、数据锁定等。
查看更多关于$inc
here: https://docs.mongodb.com/manual/reference/operator/update/inc/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)