文章目录

  • 一、概述
    • 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入门操作汇总相关推荐

  1. MongoDB 数据库操作汇总

    本篇主要用于汇总MongoDB专栏,提供快速访问链接: 一.安装与基本介绍 MongoDB安装与使用 MongoDB 中的基本概念 MongoDB 数据库操作 MongoDB 集合操作 二.CRUD操 ...

  2. mongoDB 入门指南、示例

    http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html mongoDB 入门指南.示例 上一篇:简单介绍mongoDB 一.准备工作 ...

  3. mongodb入门的几篇文章

    2019独角兽企业重金招聘Python工程师标准>>> mongoDB 入门指南.示例 比较简洁概要的描述了mongodb中常用的操作. 8天学通MongoDB 从安装,简单的增删改 ...

  4. PyMongo--非关系型数据库mongodb入门(一步一步 版)

    PyMongo--非关系型数据库mongodb入门(一步一步 版) 本文主要内容: 1.简要介绍mongodb 2.Pymongo 3.mongo shell 4.我的mongodb入门之旅 1.简要 ...

  5. python代码大全和用法用量_python零基础入门命令方式汇总大全,快速恶补你的Python基础...

    原标题:python零基础入门命令方式汇总大全,快速恶补你的Python基础 无意中浏览到这篇来自大牛的分享,总结的很全面,我重新排版下放在这里,希望能帮助到大家.在此十分感谢原作者! 在开始之前还是 ...

  6. MongoDB入门基础知识

    一.MongoDB介绍 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为web应用提供可扩展的高性能数据存储解决方案. MongoDB是一种可扩展的敏捷NoSQL数据库,其中M ...

  7. python基础代码大全-python零基础入门命令方式汇总大全,快速恶补你的Python基础...

    原标题:python零基础入门命令方式汇总大全,快速恶补你的Python基础 无意中浏览到这篇来自大牛的分享,总结的很全面,我重新排版下放在这里,希望能帮助到大家.在此十分感谢原作者! 在开始之前还是 ...

  8. 探花交友_第2章-完善个人信息与MongoDB入门

    探花交友_第2章-完善个人信息与MongoDB入门 文章目录 探花交友_第2章-完善个人信息与MongoDB入门 1.完善个人信息 1.1.图片上传 1.1.1.图片存储解决方案 1.1.2.阿里云O ...

  9. C# 零基础入门知识点汇总

    C# 零基础入门 知识点汇总 前言 一,基础语法(1~10) 二,流程控制(11~20) 三,数组相关(21~30) 四,函数介绍(31~40) 五,类和对象(41~50) 六,面向对象(51~60) ...

最新文章

  1. c语言6字符宽度和小数位数,2017年计算机二级C语言考点复习
  2. wxWidgets:wxNotebook类用法
  3. Open vSwitch介绍
  4. WebSocket客户端连接成功后,返回的socket里有用的字段
  5. JAVA编写提示用户输入投资额_java(计算银行存款总额(要求输入错误时,提示重新输入))...
  6. C++ 常用基础概念
  7. Shiro教程及案例
  8. K均值聚类算法以及模糊K均值算法研究,matlab
  9. iOS实现模拟定位功能
  10. vue运行之神奇的npm install --legacy-peer-deps
  11. mount --bind作用与用法
  12. Grasshopper脚本电池处理全站仪数据,生成建筑、线状地物和地形
  13. 基于半车悬架的轴距预瞄与轴间预瞄仿真对比
  14. 细说Java性能测试第三课 性能测试详解2
  15. TCmalloc (google开源项目核心部分模拟实现)
  16. PGPool-II 4.2.1+PostgreSQL 13高可用
  17. composer查看镜像地址
  18. 10月18号 蒟蒻的流水账
  19. python爬取微博热搜写入数据库_python实现爬取微博热搜存入Mysql
  20. c语言程序设计教学要求,C语言程序设计教学中的问题及改革建议①

热门文章

  1. 雾蒙蒙的云朵-飞机上
  2. OHEM在线难样例挖掘的两个细节
  3. echart时日周分别统计
  4. Linux内核启动流程分析(二)【转】
  5. kooboo中axios的探索之路
  6. 简单音乐铃声(接口版)
  7. 【Vue+DRF生鲜电商】28.支付宝支付接口类解读,支付逻辑编辑
  8. 嵌入式开发-迅为IMX6开发板硬件详情介绍
  9. 火云开发课堂 - 《Shader从入门到精通》系列 第六节:在Shader中使用纹理动画
  10. 微信小程序标题栏和导航栏的设置 —— 微信小程序教程系列(7)