写博客的时候有一个这样的业务,一个标签集合和一个文章集合,它们是多对多的关系,文章集合中tags字段包含它对应的标签,现在修改标签集合中某条标签记录的名字,文章集合中所有包含这个标签的tags字段的值也要随之修改,之前的办法是这样写的:

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('文章更新成功');
})

//mongodb 写法 db.rbacs.update({grants:{$all:['user']}},{$set:{"grants.$":'user2'}})

//$all的值必须是一个数组

最新文章

  1. History API与浏览器历史堆栈管理
  2. Lind.DDD.Manager里菜单权限的设计
  3. Struts2:类型转换器
  4. 洛谷八月月赛Round1凄惨记
  5. Dynamic CRM 2013学习笔记(十二)实现子表合计(汇总,求和)功能的通用插件
  6. Ajax介绍
  7. startActivityForResult的用法和demo
  8. &lt;mate&gt;标签中属性/值的各个意思
  9. 基于 xorm 的服务端框架 XGoServer
  10. 【Noip2015】斗地主
  11. TCP-IP详解笔记5
  12. [转]Angular4 数据请求 POST、GET
  13. 重新学习angularjs--第一篇(入门)
  14. 1.Spring AOP (上)
  15. Ajax初窥
  16. Windos10 mysql-8.0.13安装手顺
  17. MySQL一主两从
  18. [LeetCode] 26. Remove Duplicates from Sorted Array ☆
  19. GridView 内容自动换行 简单记录
  20. angularjs中的ng-src和ng-href

热门文章

  1. python之模块ftplib(FTP协议的客户端)
  2. Linux手工添加swap
  3. 转:extern &quot;C&quot;的用法解析
  4. 数据库行列转换sql
  5. java代码行数计算器
  6. sql server @@ROWCOUNT 会被 if 给 清 0
  7. 工作8年对技术学习过程的一些 总结 与 感悟 为什么有时迷茫、无奈 学习编程语言的最高境界最重要的是编程思想 T 字发展 学技术忌讳”什么都会“ 每天进步一点等式图 时间管理矩阵
  8. 进阶之路(基础篇) - 019 Serial串口函数说明
  9. Git 配置(分布式版本控制系统)
  10. Android基础之——CountDownTimer类,轻松实现倒计时功能