MongoDB入门操作汇总
文章目录
- 一、概述
- 1.1 与RDBMS的纵向对比
- 二、基本操作
- 三、游标
- 3.1 游标方法的释义及示例
- 四、索引
- 五、聚合查询
一、概述
mongo是一款用C++开发的高性能文档型数据库,是主流NOSQL之一。
特点是高性能、高可用、可伸缩、易部署、易使用,存储数据方便。
主要特性有:面向集合存储,易于存储对象类型的数据,模式自由,支持动态查询,支持完全索引,支持复制和故障恢复,使用高效的二进制数据存储,文件存储格式为 BSON ( 一种 JSON 的扩展)等。
1.1 与RDBMS的纵向对比
MySQL | MongoDB | 释义 |
---|---|---|
database | dataBase | 数据库 |
table | collection | 表/集合 |
row | document | 行/文档 |
column | field | 列/字段属性 |
table join | 不支持 | 表连接 |
primary key | primary key | 主键 |
二、基本操作
展示当前实例下的所有库
show dbs
展示当前库信息
db.stats()
库切换
use db_name
如果待切换的库不存在,则直接创建
创建集合
db.createCollection(name, options)
options是可选参数,包括内存及索引的配置
展示库下所有集合
show collections
向集合插入一条数据
db.[collection_name].insertOne({"key":"value"})
db.[collection_name].insert({"key":"value"})
向集合插入多条数据
db.[collection_name].insertMany([{"key":"value"},{"key":"value"}......])
删除集合中的数据
Scene.1
db.[colleciton_name].remove({"key":"value"})
db.[collection_name].deleteMany({"key":"value"})
类比MySQL中的
delete from table_name where key=value;
Scene.2
db.[collection_name].remove({"key":{$gt:num}})
类比MySQL中的
delete from table_name where key>num;
Scene.3
db.[collection_name].remove({"key":{$gte:num}})
类比MySQL中的
delete from table_name where key>=num;
mongo中的比较运算符一览
$eq (is equal) =$gt (greater than ) >$gte >= $lt (less than) <$lte <= $ne (not equal) !=$in in$nin (not in) !in, and$or or
用法示例
操作符 | 格式 | 实例 | MySQL类比 |
---|---|---|---|
and | {key1 : value1, key2 : value2, …} | db.test.find( {name : “pen”, price : 10} ) | where name = “pen” and price = 10 |
or | {$or : [{key1 : value1}, {key2 : value2}, …]} | db.test.find( {$or:[{name : “pen”},{price : 10}]} ) | where name = “pen” or price = 10 |
修改集合中的数据
Scene.1
db.[collection_name].update({"key":"value"},{$set:{"keyC":"valueC"}})
类比MySQL中的
update table_name set keyC=valueC where key=value;
Scene.2
db.[colletion_name].save(obj)
obj是一条携带_id的记录,如果_id在集合中已存在,则覆盖对应记录,否则新增记录.
查找集合中的数据
Scene.1
db.[collection_name].find()
查询所有数据。以文本形式显示,以插入的先后顺序排序。
Scene.2
db.[collection_name].find().pretty()
查询所有数据,以JSON格式显示。
Scene.3
db.[collection_name].find({"key":"value"})
类比MySQL
select * from table_name where key=value;
Scene.4
查询集合中前n条数据
db.[collection_name].find().limit(n)
Scene.5
跳过集合中前n条数据进行返回
db.[collection_name].find().skip(n)
Scene.6
对结果集升序排序
db.test.find().sort({"key" : 1})
类比MySQL中的
select * from table_name order by key asc;
对结果集降序排序则将“key”值改为-1。
三、游标
对集合调用find()方法时,会获取一个游标返回。这个游标默认迭代二十次。如果将它赋值给局部变量,那么可以进行手动迭代。所以如果直接调用find()获取结果集,那么最多只能取到20条文档。
3.1 游标方法的释义及示例
测试数据集
> db.csr.find()
{ "_id" : 1, "name" : "叶秋" }
{ "_id" : 2, "name" : "吴枫" }
{ "_id" : 3, "name" : "罗淼" }
1.hasNext
判断是否有更多文档
> var cursor = db.csr.find()
> while (cursor.hasNext()){... var doc = cursor.next();
... print(doc); //打印一个BSON对象
... printjson(doc); //解析成JSON格式打印
... }
[object BSON]
{ "_id" : 1, "name" : "叶秋" }
[object BSON]
{ "_id" : 2, "name" : "吴枫" }
[object BSON]
{ "_id" : 3, "name" : "罗淼" }
2.next
用来获取下一行文档
> var cursor = db.csr.find()
> var cursor = db.csr.find()
> cursor.next()
{ "_id" : 1, "name" : "叶秋" }
> cursor.next()
{ "_id" : 2, "name" : "吴枫" }
> cursor.next()
{ "_id" : 3, "name" : "罗淼" }
> cursor.next()
uncaught exception: Error: error hasNext: false :
DBQuery.prototype.next@src/mongo/shell/query.js:304:15
@(shell):1:1
3.toArray
将查询结果放到数组中
> var cursor = db.csr.find()
> var result=cursor.toArray()
> print(result)
[object BSON],[object BSON],[object BSON]
> printjson(result)
[{"_id" : 1,"name" : "叶秋"},{"_id" : 2,"name" : "吴枫"},{"_id" : 3,"name" : "罗淼"}
]
4.count
查询文档总数量
> var cursor = db.csr.find()
> print(cursor.count())
3
5.limit
限制查询结果的返回数量
> db.csr.find().limit(2)
{ "_id" : 1, "name" : "叶秋" }
{ "_id" : 2, "name" : "吴枫" }
6.skip
跳过指定数目的文档
> db.csr.find().skip(1)
{ "_id" : 2, "name" : "吴枫" }
{ "_id" : 3, "name" : "罗淼" }
7.sort
对查询结果进行排序
> db.csr.find().sort({"_id":1})
{ "_id" : 1, "name" : "叶秋" }
{ "_id" : 2, "name" : "吴枫" }
{ "_id" : 3, "name" : "罗淼" }
> db.csr.find().sort({"_id":-1})
{ "_id" : 3, "name" : "罗淼" }
{ "_id" : 2, "name" : "吴枫" }
{ "_id" : 1, "name" : "叶秋" }
8.objsLeftInBatch
查看当前批次的未被迭代的剩余文本数量
> var cursor = db.csr.find()
> print(cursor.objsLeftInBatch())
3
> cursor.next()
{ "_id" : 1, "name" : "叶秋" }
> print(cursor.objsLeftInBatch())
2
9.addOption
修改游标行为
参数 | 描述 |
---|---|
DBQuery.Option.tailable | 设置光标在接收到最后一个数据后不关闭,从而允许查询 continue 返回在耗尽初始结果之后添加的数据。 |
DBQuery.Option. slaveOk | 允许查询副本从属。 |
DBQuery.Option.noTimeout | 防止游标超时 |
DBQuery.Option.awaitData | 将光标设置为阻塞并 await 一段时间,而不返回任何数据。一旦超时到期,光标将不返回任何数据。 |
DBQuery.Option.exhaust | 设置游标一次性返回查询返回的所有数据,而不是将结果分成批次。 |
DBQuery.Option.partial | 设置游标以针对某个分片群集从查询中返回部分数据,在分片群集中,某些分片不响应而是抛出错误。 |
> var cursor = db.csr.find().addOption(DBQuery.Option.exhaust)
10.hint
为查询强制使用指定索引
> db.csr.find().hint({_id:1})
{ "_id" : 1, "name" : "叶秋" }
{ "_id" : 2, "name" : "吴枫" }
{ "_id" : 3, "name" : "罗淼" }
11.explain
用于获取执行计划
> db.test.explain().find()
{"queryPlanner" : {"plannerVersion" : 1,"namespace" : "test.test","indexFilterSet" : false,"parsedQuery" : {},"queryHash" : "8B3D4AB8","planCacheKey" : "8B3D4AB8","winningPlan" : {"stage" : "COLLSCAN","direction" : "forward"},"rejectedPlans" : [ ]},"serverInfo" : {"host" : "DESKTOP-8IVVOTG","port" : 27017,"version" : "4.4.1","gitVersion" : "ad91a93a5a31e175f5cbf8c69561e788bbc55ce1"},"ok" : 1
}
12.snapshot
对查询结果使用快照。文档可能会因体积变大而被合并到文档尾部。为了使查询结果集顺序不变,可以使用快照。
经测试在mongo4.4中已废弃。
四、索引
在查询操作时,如果执行器总是扫描所有文档,那么效率将非常低下。为了解决这个问题,要用到索引。
与MySQL一样,MongoDB也采用B树索引。索引级别从上往下依次为集合、文档字段、文档子字段。
单索引
在key上创建升序索引
db.[collection_name].createIndex("key":1)
在key上创建降序索引
db.[collection_name].createIndex("key":-1)
索引的升降序无关紧要,执行器可以在任意方向遍历索引。
示例
> db.score.insertMany([{"score":80,"name":"wf"},{"score":90,"name":"timi"}])
{"acknowledged" : true,"insertedIds" : [ObjectId("5fb620f9f20c8fd2914fb1b9"),ObjectId("5fb620f9f20c8fd2914fb1ba")]
}
> db.score.createIndex({"score":1})
{"createdCollectionAutomatically" : false,"numIndexesBefore" : 1,"numIndexesAfter" : 2,"ok" : 1
}
复合索引
复合索引类似于Oracle里的组合索引。
db.[collection_name].createIndex("key1":1/-1,"key2":1/-1)
这里键值顺序是能够决定索引扫描的先后顺序的。
多键值索引
创建方式与单索引相同,当被索引的键值为数组时,索引被称为多键值索引,这样的索引会为数组中的每个元素创建索引键。
地理索引
适用于坐标字段的索引
全文索引
db.[collection_name].createIndex({"key":"text"})
散列索引
按照某个字段的散列值来建立索引,目前只能用于字段完全匹配,而不能用于范围查询。
db.[collection_name].createIndex({"key":"hashed"})
派生索引
索引上面还可以加索引,包括稀疏索引、唯一索引、过期索引等。我将其统称为派生索引。
稀疏索引
在一般索引的基础上加上稀疏索引后,索引将跳过所有不包含索引字段的文档,因此是稀疏的。
db.[collection_name].createlndex ({ "key" : 1/-1 }, { sparse : true })
唯一索引
设置了唯一索引之后,那么新插入文档时,要求key值是唯一的。
db.[collection_name].createlndex ({ "key" : 1/-1 }, { unique : true })
过期索引
用于在一定时间后删除字段。
db.[collection_name].createlndex( {"key" : 1/-1 }, { expireAfterSeconds: 3600 })
以上这个索引的作用是:文档插入3600秒后自动删除。
查看集合下索引
db.[collection_name].getIndexes()
删除单个索引
db.[collection_name].dropIndex({"key":1/-1/"text"/"hashed"})
删除多个索引
db.[collection_name].dropIndexes()
删除_id的索引之外的所有索引。
修改索引
删除后重新创建。
五、聚合查询
聚合管道方法
执行器将文档输入处理管道,在管道内对文档进行操作,最后将文档聚合为结果。
场景举例
数据集
> db.score.find()
{ "_id" : ObjectId("5fb620f9f20c8fd2914fb1b9"), "score" : 80, "name" : "wf" }
{ "_id" : ObjectId("5fb620f9f20c8fd2914fb1ba"), "score" : 90, "name" : "timi" }
{ "_id" : ObjectId("5fb6313c52508030c9eedd15"), "name" : "wf", "score" : 10 }
以name为聚合条件,查出每个人的总分
> db.score.aggregate([{$group:{_id:"$name",total:{$sum:"$score"}}}])
{ "_id" : "wf", "total" : 90 }
{ "_id" : "timi", "total" : 90 }
类比MySQL中的
select name as _id,sum(score) as total from table_name group by name;
管道(进程间通信渠道)的RAM(随机存储器)的上限为100M,若要扩容,需人为修改。
Map/Reduce方法
对文档进行分组和归约从而得到最终结果。
编写map
> var map=function(){emit(this.name,this.score);};
编写reduce
> var reduce=function(key,values){return Array.sum(values);};
执行mapreduce任务
> db.score.mapReduce(map,reduce,{out:{replace:'map_reduce_result'}})
{ "result" : "map_reduce_result", "ok" : 1 }
以上语句会生成一个新的集合并将结果保存其中。查看一下
> db.map_reduce_result.find()
{ "_id" : "wf", "value" : 90 }
{ "_id" : "timi", "value" : 90 }
MongoDB入门操作汇总相关推荐
- MongoDB 数据库操作汇总
本篇主要用于汇总MongoDB专栏,提供快速访问链接: 一.安装与基本介绍 MongoDB安装与使用 MongoDB 中的基本概念 MongoDB 数据库操作 MongoDB 集合操作 二.CRUD操 ...
- mongoDB 入门指南、示例
http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html mongoDB 入门指南.示例 上一篇:简单介绍mongoDB 一.准备工作 ...
- mongodb入门的几篇文章
2019独角兽企业重金招聘Python工程师标准>>> mongoDB 入门指南.示例 比较简洁概要的描述了mongodb中常用的操作. 8天学通MongoDB 从安装,简单的增删改 ...
- PyMongo--非关系型数据库mongodb入门(一步一步 版)
PyMongo--非关系型数据库mongodb入门(一步一步 版) 本文主要内容: 1.简要介绍mongodb 2.Pymongo 3.mongo shell 4.我的mongodb入门之旅 1.简要 ...
- python代码大全和用法用量_python零基础入门命令方式汇总大全,快速恶补你的Python基础...
原标题:python零基础入门命令方式汇总大全,快速恶补你的Python基础 无意中浏览到这篇来自大牛的分享,总结的很全面,我重新排版下放在这里,希望能帮助到大家.在此十分感谢原作者! 在开始之前还是 ...
- MongoDB入门基础知识
一.MongoDB介绍 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为web应用提供可扩展的高性能数据存储解决方案. MongoDB是一种可扩展的敏捷NoSQL数据库,其中M ...
- python基础代码大全-python零基础入门命令方式汇总大全,快速恶补你的Python基础...
原标题:python零基础入门命令方式汇总大全,快速恶补你的Python基础 无意中浏览到这篇来自大牛的分享,总结的很全面,我重新排版下放在这里,希望能帮助到大家.在此十分感谢原作者! 在开始之前还是 ...
- 探花交友_第2章-完善个人信息与MongoDB入门
探花交友_第2章-完善个人信息与MongoDB入门 文章目录 探花交友_第2章-完善个人信息与MongoDB入门 1.完善个人信息 1.1.图片上传 1.1.1.图片存储解决方案 1.1.2.阿里云O ...
- C# 零基础入门知识点汇总
C# 零基础入门 知识点汇总 前言 一,基础语法(1~10) 二,流程控制(11~20) 三,数组相关(21~30) 四,函数介绍(31~40) 五,类和对象(41~50) 六,面向对象(51~60) ...
最新文章
- c语言6字符宽度和小数位数,2017年计算机二级C语言考点复习
- wxWidgets:wxNotebook类用法
- Open vSwitch介绍
- WebSocket客户端连接成功后,返回的socket里有用的字段
- JAVA编写提示用户输入投资额_java(计算银行存款总额(要求输入错误时,提示重新输入))...
- C++ 常用基础概念
- Shiro教程及案例
- K均值聚类算法以及模糊K均值算法研究,matlab
- iOS实现模拟定位功能
- vue运行之神奇的npm install --legacy-peer-deps
- mount --bind作用与用法
- Grasshopper脚本电池处理全站仪数据,生成建筑、线状地物和地形
- 基于半车悬架的轴距预瞄与轴间预瞄仿真对比
- 细说Java性能测试第三课 性能测试详解2
- TCmalloc (google开源项目核心部分模拟实现)
- PGPool-II 4.2.1+PostgreSQL 13高可用
- composer查看镜像地址
- 10月18号 蒟蒻的流水账
- python爬取微博热搜写入数据库_python实现爬取微博热搜存入Mysql
- c语言程序设计教学要求,C语言程序设计教学中的问题及改革建议①