目录:

  • 聚合
  • 更新
  • 更新选择器
  • ObjectId
  • 更新操作的原子性

聚合:

聚合语法:db.collectionName.aggregate(aggregate_operation)

聚合操作其实就是管道操作,上一次操作的结果集就是下一次管道的输入数据。

1、$group:分组计算

  • $sum、$avg、$min、$max:获取分组集合中的总和、平均值、最大值、最小值
  • $push:将指定表达式添加到一个数组中
  • $addToSet:将指定表达式添加到集合中(无重复)
  • $first:返回每组第一个文档,如有排序按照排序返回,没有则按照文档的默认顺序
  • $last:同$first,但返回最后一个文档

示例

1、统计不同住址的用户人数
db.users.aggregate({
'$group':{'_id':'$address', 'number':{'$sum':1}}
}) 2、分别拿到每个住址区域中升高最高的
db.users.aggregate({
'$group':{'_id':'$address', 'number':{'$max':'$length'}}
}) 3、分组用户住址,并显示此区域下所有的用户姓名
db.users.aggregate({
'$group':{'_id':'$address', 'username':{'$push':'$username'}}
}) 4、分组用户住址,并显示此区域下最后一名用户的姓名
db.users.aggregate({
'$group':{'_id':'$address', 'lastUsername':{'$last':'$username'}}
})

2、$project:输出文档中指定的字段。

示例:

1、获取每个用户的年龄及身高
db.users.aggregate({
'$project':{'age':1, 'length':1}
})

3、$match:过滤数据,使用mongoDB标准的查询操作($eq、$ne等等)。

示例:

1、获取升高大于1.8的用户姓名及身高
db.users.aggregate(
{'$match':{'length':{'$gt':1.8}}},
{'$project':{'username':1, 'length':1}}
)

4、$limit:限制文档返回数量;$skip:跳过指定数量的文档、$sort:排序(1=升序,-1=降序)。

示例:

1、获取身高第二和第三高的用户姓名
db.users.aggregate(
{'$sort':{'length':-1}},
{'$skip':1},
{'$limit':2},
{'$project':{'username':1}}
)

5、$unwind:将文档中某一个数组拆分成多条。

示例:

1、获取被评论次数最多的电影
db.users.aggregate(
{'$unwind':'$comments'},
{'$group':{'_id':'$comments.movies', 'count':{'$sum':1}}},
{'$sort':{'count':-1}},
{'$limit':1},
{'$project':{'_id':1}}
)

spring data mongoDB写法见:https://github.com/mrjdrs/mongodb-demo/tree/master/mongo-selector

更新:

在mongo中更新分为两种:

1、替换更新:使用新文档替代旧文档。

2、操作符更新:在一个或多个文档上修改。

更新语法

db.collectionName.update(
<query>,
<update>,
{upsert:<boolean>, multi:<boolean>, wirteConcern:<document>}
)

参数说明

1、query:更新的查询条件

2、update:更新操作符的选择

3、upsert:若不存在更新的数据,是否插入一条新的数据;true=插入,false=不插入(默认)。

4、multi:是否更新多条,true=更新找到的多条数据,false=仅更新找到的第一条(默认)。

5、writeConcern:写入数据的安全配置。

更新选择器:

示例

1、将java编程思想这本书籍价格加10
db.product.update(
{'name':'java编程思想'},
{'$inc':{'price':10}}
) 2、更新java编程思想这本书名为java编程思想第四版
db.product.update(
{'name':'java编程思想'},
{'$set':{'name':'java编程思想第四版'}}
) 3、将姓名为路飞,评论电影为战狼的那条数据修改评论为战狼电影的评论
// 注意$操作符一次只能修改一条数据
db.users.update(
{'username':'路飞', 'comments.movies':'战狼'},
{'$set':{'comments.$.content':'战狼电影的评论'}}
) 4、为书籍java编程思想第四版添加两个标签值
db.product.update(
{'name':'java编程思想第四版'},
{'$push':{'tags':{'$each':['标签1', '标签2']}}}
)

spring data mongoDB写法见:https://github.com/mrjdrs/mongodb-demo/tree/master/mongo-selector

ObjectId:

我们知道在mongo中insert操作是没有返回值的,但有些业务场景又需要拿到insert后的id,那我们改怎么办呢?

我们发现mongo的update操作有返回值,所以可以用update代替insert来获取ObjectId,以完成上述的业务场景。

db.users.update(
{'':''},
{'username':'zd'},
{'upsert':true}
)

更新操作的原子性:

mongo的所有更新都是原子的,所有的写操作都有锁;2.2版本之前是实例级别,2.2之后是数据库级别,3.0+为文档级别。

原子性更新的语法

db.collectionName.findAndModify({
query:{},
updae:{},
remove:true|false,
new:true|false,
sort:{},
fields:{},
upsert:true|false
})

参数解释

1、query:查询选择器

2、update:要更新的值,不能与remote同时出现

3、remove:删除符合query条件的文档,不能与update同时出现

4、new:true=返回更新后的文档,false=返回更新前的文档;默认false

5、sort:排序条件

6、fields:投影操作,与find操作的第二个参数一致

7、upsert:与update的upsert参数一致,但它不仅会插入update的内容,还会插入query的内容

MongoDB学习笔记(三、MongoDB聚合与更新)的更多相关文章

  1. Mongodb学习笔记三(Mongodb索引操作及性能测试)

    第三章 索引操作及性能测试 索引在大数据下的重要性就不多说了 下面测试中用到了mongodb的一个客户端工具Robomongo,大家可以在网上选择下载.官网下载地址:http://www.robomo ...

  2. Mongodb学习笔记一(Mongodb环境配置)

    Mongodb学习 说明: MongoDB由databases组成,database由collections组成,collection由documents组成,document由fileds组成.Mo ...

  3. MongoDB学习笔记三:查询

    MongoDB中使用find来进行查询.查询就是返回一个集合中文档的子集,子集合的范围从0个文档到整个集合.find的第一个参数决定了要返回哪些文档,其形式也是一个文档,说明要执行的查询细节.空的查询 ...

  4. MongoDB学习笔记一(MongoDB介绍 + 基本指令 + 查询语句)

    什么是MongoDB MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在为WEB应用提供可扩 ...

  5. MongoDB学习笔记(一) MongoDB介绍及安装(摘)

    MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种.它在许多场景下可用于替代传统的关系型数据库或键/值存储方式.Mongo使用C++开发.Mongo的官方网 ...

  6. Mongodb学习笔记二(Mongodb基本命令)

    第二章 基本命令 一.Mongodb命令 说明:Mongodb命令是区分大小写的,使用的命名规则是驼峰命名法. 对于database和collection无需主动创建,在插入数据时,如果databas ...

  7. MongoDb 学习笔记(一) --- MongoDb 数据库介绍、安装、使用

    1.数据库和文件的主要区别 . 数据库有数据库表.行和列的概念,让我们存储操作数据更方便 . 数据库提供了非常方便的接口,可以让 nodejs.php java .net 很方便的实现增加修改删除功能 ...

  8. Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T>

    Caliburn.Micro学习笔记目录 今天 说一下Caliburn.Micro的IEventAggregator和IHandle<T>分成两篇去讲这一篇写一个简单的例子 看一它的的实现 ...

  9. MongoDB学习笔记五:聚合

    『count』count是最简单的聚合工具,返回集合中的文档数量:> db.foo.count()0> db.foo.insert({"x" : 1})> db. ...

  10. MongoDB学习笔记三—增删改文档上

    插入insert 单条插入 > db.foo.insert({"bar":"baz"}) WriteResult({ }) 批量插入 > db.fo ...

随机推荐

  1. springboot 打包jar 运行找资源文件

    使用如下方式读取文件:ClassPathResource cpr = new ClassPathResource("static/ok.png");byte[] bdata = F ...

  2. laravel开发大型电商网站之异常设计思路分析

    令人讨厌的异常 提起异常,大家都很反感,当信心满满的写完一段代码,刷新页面发现上面写着大大的 Exception 是最心烦的时候了.模块给领导演示的时候,如果报了异常,也是最让人崩溃的时候了. 在一般 ...

  3. JVM学习分享-练习题

    package org.fenixsoft.clazz; public class TestClass { private int m; public int inc() { return m + 1 ...

  4. iOS中去除重复的数据

    本人只用了其中一个功能: 需求:一个已知数组arr,判断一个新字符str是否已经存在于arr中,如果不存在,则存入数组arr中 //去重 if (![arr containsObject:str]) ...

  5. 极客必备 Chrome 浏览器插件

    本文微信公众号「AndroidTraveler」首发. 自己平时使用的最多的就是 Chrome 浏览器,因此本文主要分享自己添加的一些扩展程序. 介绍扩展程序的时候也是以我本人的实际使用为主,有些功能 ...

  6. 史上最全Oracle数据泵常用命令

    本文转自https://blog.csdn.net/Enmotech/article/details/102848825 墨墨导读:expdp和impdp是oracle数据库之间移动数据的工具,本文简 ...

  7. git 分布式控制版本管理器(上)

    git的作用: 1.更方便的存储版本 2.恢复之前的版本 3.更方便的对比 4.协同合作 下载地址git官网: https://git-scm.com/ 可自选自己电脑的操作系统 安装: 一路next ...

  8. Qt 信号和槽异常: QObject::connect: No Such slot baseClassName::subClassfunction() in ......

    2019-08-14起笔 小熊的情况描述: 父类A继承自QWidget,所以父类A自动添加了Q_OBJECT.  子类B继承自父类A,子类B没有添加Q_OBJECT.在子类B中给动态创建的控件添加事件 ...

  9. shadertoy使用教程

    shadertoy使用教程 /** *常量定义 */ uniform vec3 iResolution; // 窗口分辨率,单位像素 uniform float iTime; // 程序运行的时间,单 ...

  10. 挑战10个最难回答的Java面试题(附答案)

    译者:Yujiaao segmentfault.com/a/1190000019962661 推荐阅读(点击即可跳转阅读) 1. SpringBoot内容聚合 2. 面试题内容聚合 3. 设计模式内容 ...