如果一个文档中有个类型为字符串数组的字段,比如{id:1,tags:[‘aa‘,‘bb‘,‘cc‘]},现在要将tags字段的‘bb‘改为‘BB‘,之前的办法是这样写的:
articleModel.find({tags:{$all:[doc.name]}},function(err,articles){
articles.forEach(function(article){
for(var j = 0;j<article.tags.length;j++){
if(article.tags[j] === doc.name){
article.tags[j] = req.body.name;
article.markModified(‘tags‘);
article.save();
break;
}
}
})
})
上面代码的意思,在article集合中找到所有文档的tags字段包含有doc.name的记录,然后遍历找到的结果集,循环更新每条记录。这样写代码繁琐,效率又不高,后面在这里找到灵感http://cnodejs.org/topic/541be549ad60405c1f02f660,改善后的代码如下:
articleModel.update({tags:{$all:[doc.name]},tags:doc.name,$atomic:true},{$set:{"tags.$":req.body.name}},{multi:true},function(err){
if(err) return console.log(err);
console.log(‘文章更新成功‘);
})
下面这样写也可以,我猜想需要被修改的字段只要出现在第一个参数的条件表达式中就可以了
articleModel.update({tags:{$all:[doc.name]},$atomic:true},{$set:{"tags.$":req.body.name}},{multi:true},function(err){
if(err) return console.log(err);
console.log(‘文章更新成功‘);
})
原文:http://www.cnblogs.com/toward-the-sun/p/6749031.html