MongoDB 基本操作和聚合操作
一 . MongoDB 基本操作
基本操作可以简单分为查询、插入、更新、删除。
1 文档查询
| 作用 | MySQL SQL | MongoDB |
| 所有记录 | SELECT * FROM users; | db.users.find(); |
| age =18 | SELECT * FROM users WHERE age = 18; | db.users.find({“age”:18}); |
| 筛选字段 | SELECT age FROM users WHERE age = 18; | db.users.find({“age”:18},{age:1}); |
| 排序 | SELECT * FROM users ORDER BY name ASC | db.users.find().sort({name:1}); |
| 比较 | SELECT * FROM users WHERE age > 18; | db.users.find({“age”:{$gt:18}}); |
| 正则 | SELECT * FROM users WHERE name LIKE zha; | db.users.find({“name”:/^zha/}); |
| 忽略 | SELECT * FROM users LIMIT 10 SKIP 20; | db.users.find().limit(10).skip(20); |
| or | SELECT * FROM users WHERE a=1 or b=2; | db.users.find({$or : [{ a : 1} , {b : 2}]}); |
| distinct | SELECT DISTINCT name FROM users; | db.users.distinct(‘name'); |
| count | SELECT COUNT(name) FROM users; | db.users.find({name: {'$exists': true}}).count(); |
2.文档插入
| 作用 | 操作指令(案例) |
| 单文档插入 | db.inventory.insertOne( { item: "canvas", qty: 100, tags: ["cotton"], size: { h: 28, w: 35.5, uom: "cm" } } ) |
| 多文档批量插入 |
db.inventory.insertMany([ { item: "journal", qty: 25, tags: ["blank", "red"], size: { h: 14, w: 21, uom: "cm" } }, { item: "mat", qty: 85, tags: ["gray"], size: { h: 27.9, w: 35.5, uom: "cm" } }, { item: "mousepad", qty: 25, tags: ["gel", "blue"], size: { h: 19, w: 22.85, uom: "cm" } } ]) |
文档大量插入时,通过多文档批量插入的形式可以大大提高性能,但是MongoDB 4.0 之前的版本是单文档事务型,所以,在多文档批量插入时,不能保证所有文档操作的原子性,即插入过程中,如果不幸出现了系统问题,有可能部分文档插入成功,而部分文档插入失败。
3.文档更新
文档更新主要有两种形式,一种是替换修改,一种是通过操作符修改。后者是常见的修改方式,在此主要讲解后者。
| 操作符 | 操作符描述 |
| $inc | 根据给定的值增加字段 |
| $set | 设置字段给定的值 |
| $unset | 取消设置字段 |
| $rename | 重命名字段为给定的值 |
| $setOnInsert |
在upsert中,只在插入时设置字段; 如果要更新的文档存在那么$setOnInsert操作符不做任何处理 |
| $bit | 只执行按位更新字段 |
关于数组数据的更新操作符
| 数组操作符 | 数组操作符描述 |
| $push | 添加值到数组中 |
| $addToSet | 添加值到数组中,重复了也不处理 |
| $pop | 从数组中删除第一个或最后一个值 |
| $pull | 从数组中删除匹配查询条件的值 |
| $eash | 与$push和$addToSet一起使用来操作多个值 |
| $slice | 与$push和$each一起使用来缩小更新后数组的大小 |
4.文档删除
集合数据的删除主要通过remove的命令来删除,类似于关系型数据库中的delete。
二 聚合操作
| MySQL | MongoDB | 功能描述 |
| select | $project | 指定输出文档里的字段 |
| where | $match | 选择要处理的文档,与find()类似 |
| group by | $group | 根据key来分组文档 |
| having | $match | 刷选文档 |
| limit | $limit | 限制传递给下一步的文档数量 |
| order by | $sort | 排序文档 |
| count/sum | $sum | 统计 |
| join | $unwind | 扩展数组,为每个数组入口生成一个输出文档 |
| join | $look up | 表关联 |
| skip | $skip | 跳过一定数据量的文档 |
MongoDB 基本操作和聚合操作的更多相关文章
- MongoDB中的聚合操作
根据MongoDB的文档描述,在MongoDB的聚合操作中,有以下五个聚合命令. 其中,count.distinct和group会提供很基本的功能,至于其他的高级聚合功能(sum.average.ma ...
- MongoDB学习笔记——聚合操作之聚合管道(Aggregation Pipeline)
MongoDB聚合管道 使用聚合管道可以对集合中的文档进行变换和组合. 管道是由一个个功能节点组成的,这些节点用管道操作符来进行表示.聚合管道以一个集合中的所有文档作为开始,然后这些文档从一个操作节点 ...
- MongoDB学习笔记——聚合操作之MapReduce
MapReduce MongoDB中的MapReduce相当于关系数据库中的group by.使用MapReduce要实现两个函数Map和Reduce函数.Map函数调用emit(key,value) ...
- MongoDB学习笔记——聚合操作之group,distinct,count
单独的聚合命令(group,distinct,count) 单独聚合命令 比aggregate性能低,比Map-reduce灵活度低:但是可以节省几行javascript代码,后面那句话我自己加的,哈 ...
- mongoDB与sql聚合操作对应图
SQL Terms, Functions, and Concepts MongoDB Aggregation Operators WHERE $match GROUP BY $group HAVING ...
- MongoDB入门三步曲2--基本操作(续)--聚合、索引、游标及mapReduce
mongodb 基本操作(续)--聚合.索引.游标及mapReduce 目录 聚合操作 MapReduce 游标 索引 聚合操作 像大多关系数据库一样,Mongodb也提供了聚合操作,这里仅列取常见到 ...
- MongoDB的聚合操作以及与Python的交互
上一篇主要介绍了MongoDB的基本操作,包括创建.插入.保存.更新和查询等,链接为MongoDB基本操作. 在本文中主要介绍MongoDB的聚合以及与Python的交互. MongoDB聚合 什么是 ...
- MongoDB 聚合操作
在MongoDB中,有两种方式计算聚合:Pipeline 和 MapReduce.Pipeline查询速度快于MapReduce,但是MapReduce的强大之处在于能够在多台Server上并行执行复 ...
- MongoDB之三(高级操作 聚合、游标)
一: 聚合 常见的聚合操作跟sql server一样,有:count,distinct,group,mapReduce. <1> count count是最简单,最容易,也是最常用的聚合工 ...
随机推荐
- Kubernetes---存储
pod中定义需要的存储卷,类型为pvc pvc 与 pv 建立绑定关系 kubectl explain pv 定义pv时不要加namspce
- Redis 设计与实现 (二)--数据库
typedef struct redisDb { dict *dict; /* The keyspace for this DB */ dict *expires; /* Timeout of key ...
- 我对SQL性能优化的看法,对我的文章有提议的欢迎评论!
影响你的查询速度的原因是什么? 网速不给力,不稳定. 服务器内存不够,或者SQL 被分配的内存不够. sql语句设计不合理 没有相应的索引,索引不合理 表数据过大没有有效的分区设计 数据库设计太2,存 ...
- 『NOIP2018普及组题解』
标题统计 题目描述 凯凯刚写了一篇美妙的作文,请问这篇作文的标题中有多少个字符? 注意:标题中可能包含大.小写英文字母.数字字符.空格和换行符.统计标题字 符数时,空格和换行符不计算在内. 输入格式 ...
- Django里URL配置中name参数的作用
先看一下URL配置,新增了如下内容: 修改视图views.py 增加一个页面 现在要求是在name页面里面增加一个链接,显示详细信息.修改name页面 这个功能实现了,可是之前添加的那个name参数是 ...
- Vue2.0中的transition组件
组件的过度 Vue1.0中transition做为标签的行内属性被vue支持.但在Vue2.0中.Vue放弃了旧属性的支持并提供了transition组件,transition做为标签被使用. 使用t ...
- SpringBoot修改Redis序列化方式
前言 由于Springboot默认提供了序列化方式并不是非常理想,对于高要求的情况下,序列化的速度和序列化之后大小有要求的情况下,不能满足,所以可能需要更换序列化的方式. 这里主要记录更换序列化的方式 ...
- java nginx等代理或网关转发请求后获取客户端的ip地址,原理
在没有网关或者反向代理软件情况下,java里获取客户端ip地址的方法是request.getRemoteAddr() 先解释下http协议和TCP协议: 网页默认是进行http连接了,http协议即超 ...
- leetcode — flatten-binary-tree-to-linked-list
import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * Source : https://o ...
- window环境下使用filezilla server搭建ftp服务器
前言 在做项目的时候,需要提供ftp服务,开始的时候使用微软自动的iss上的ftp服务,一段时间后发现无法自定义用户,只能使用系统的用户,使用起来很不方便,在权限管理方面也是不太好.所以换用了file ...