2015-10-15 58 views
0

我有一个标签模式:猫鼬更新多个文件将不更新任何

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

尝试在'mongoose.Schema.ObjectId'中包裹ID# – chridam

+0

当我在包围ObjectId()的mongodb shell中尝试它时,工作,这是伟大的。然而,我应该如何用ObjectId()来包装数组中的每个元素? –

+0

如果标签id是十六进制字符串,那么不需要将它们转换为ObjectId,我的意思是将'req.body.id'值强制转换为ObjectId的'var mongoose = require('mongoose'); var postId = mongoose.Types.ObjectId(req.body.id);'然后在你的更新中使用它'$ addToSet:{postIds:postId}' – chridam

回答

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()