我有一个标签架构:
var labelSchema = mongoose.Schema({
name: String,
desc: String,
postIds: [mongoose.Schema.ObjectId],
removed: { type: Boolean, default: false }
})
我想在为帖子分配标签时更新postIds数组,所以我在更新帖子请求中执行:
Label.update({'_id': { $in: post.labelIds }}, {$addToSet: {postIds:req.body.id}}, {multi: true})
其中post.labelIds是标签ID的数组。我用find()方法测试了查询,它工作正常,找到所有标签。但是,当我检查数据库中的更新记录时,没有更新标签。
当我在更新命令之前执行post.LabelIds的console.log时,它返回:
[ 'uniqueidhere', 'anotheruniqidthere' ]
和req.body.id
uniqueidhere
所以ids就在那里,但不知何故更新不起作用。
答案 0 :(得分:1)
花了几个小时花在试图找出错误的位置以及为什么没有更新数据库之后,我发现它确实更新了数据库。问题是我正在检查mongo shell中的更新,在我通过nodejs post请求更新后,它没有出现在更新的shell中。但是当我在console.log()标签时,它已被更新。所以我进一步研究了这个问题,我发现问题不是mongo shell,而是mongoose命令更新的错误用法。我错过了回调参数。添加回调函数后,数据立即在mongo shell中更新。
所以不要这样做:
Label.update({'_id': { $in: post.labelIds }}, {$addToSet: {postIds:req.body.id}}, {multi: true})
不能忘记添加回调:
Label.update({'_id': { $in: post.labelIds }}, {$addToSet: {postIds:req.body.id}}, {multi: true}, function(err, affected) {
if(err)
console.log(err)
else
console.log(affected)
// After successful update, redirect here to another page...
或者重复的答案建议运行exec():
Label.update({'_id': { $in: post.labelIds }}, {$addToSet: {postIds:req.body.id}}, {multi: true}).exec()