写博客的时候有一个这样的业务,一个标签集合和一个文章集合,它们是多对多的关系,文章集合中tags字段包含它对应的标签,如今修改标签集合中某条标签记录的名字,文章集合中全部包含这个标签的tags字段的值也要随之修改,以前的办法是这样写的:node
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,改善后的代码以下:mongodb
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('文章更新成功'); })
//mongodb 写法 db.rbacs.update({grants:{$all:['user']}},{$set:{"grants.$":'user2'}})atom
//$all的值必须是一个数组spa