MongoDB 学习笔记

MongoDB 学习笔记

简介

MongoDB 将数据存储为一个文档。MongoDB是一个基于分布式文件存储的数据库。

链接格式:

mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]

数据库

一个mongodb中可以建立多个数据库,MongoDB的默认数据库为"db",该数据库存储在data目录中。

  • 创建数据库: use DATABASE_NAME, 如果数据库不存在,则创建数据库,否则切换到指定数据库
  • 如果你想查看所有数据库,可以使用 show dbs 命令: show dbs 或者 show databases
  • 删除数据库: db.dropDatabase(), 删除当前数据库,你可以使用 db 命令查看当前数据库名

文档

文档是一个键值(key-value)对(即BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型。

  • 插入文档: db.${collection_name}.insert(document)
  • 查询所有文档: db.${collection_name}.find(criteria)
    • criteria : find的查询条件,类似sql update查询内where后面的。可选
  • 查询一个文档: db.${collection_name}.findOne(criteria)
    • criteria : find的查询条件,类似sql update查询内where后面的。可选
  • MongoDB AND 条件: MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,及常规 SQL 的 AND 条件。>db.col.find({key1:value1, key2:value2}).pretty()
  • MongoDB OR 条件: MongoDB OR 条件语句使用了关键字 $or,语法格式如下,相当于: where (key1=value1 or key2=value2)
ObjectId

ObjectId 是一个12字节 BSON 类型数据,有以下格式:

  • 前4个字节表示时间戳
  • 接下来的3个字节是机器标识码
  • 紧接的两个字节由进程id组成(PID)
  • 最后三个字节是随机数。

MongoDB中存储的文档必须有一个"_id"键。这个键的值可以是任何类型的,默认是个ObjectId对象。

在一个集合里面,每个集合都有唯一的"_id"值,来确保集合里面每个文档都能被唯一标识。

MongoDB采用ObjectId,而不是其他比较常规的做法(比如自动增加的主键)的主要原因,因为在多个 服务器上同步自动增加主键值既费力还费时

db.col.find(
   {
      $or: [
	     {key1: value1}, {key2:value2}
      ]
   }
).pretty()
  • 更新文档: db.${collection_name}.update( criteria, objNew, upsert, multi )
    • criteria : update的查询条件,类似sql update查询内where后面的。
    • objNew : update的对象和一些更新的操作符(如 , , ,inc…)等,也可以理解为sql update查询内set后面的
    • upsert : 这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入
    • multi : mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新
    • 原子操作: findAndModify(query,update): query,查询条件,update,需要更新的值
  • 删除文档: db.${collection_name}.remove(<query>,<justOne>)
    • query :(可选)删除的文档的条件。
    • justOne : (可选)如果设为 true 或 1,则只删除一个文档
结果集排序

MongoDB sort()方法:在MongoDB中使用使用sort()方法对数据进行排序,sort()方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列。例如: db.${collection_name}.find().sort({KEY:1})

集合

集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表。

  • 删除集合: db.${collection_name}.drop(): ${collection_name} 是你要删除的collection名称,例如,我要删除 db 下 test 这个 collection: db.test.drop()

RDBMS 与 MongoDB 对应的术语

RDBMSMongoDB
数据库数据库
表格集合
文档
字段
表联合嵌入文档
主键主键:MongoDB 提供了 key 为_id

RDMS 与 MongoDB 对应SQL举例

见: https://docs.mongodb.com/manual/reference/sql-comparison/#select

索引

索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录

创建索引: ensureIndex() 方法,db.${collection_name}.ensureIndex({KEY:1})。语法中 Key 值为你要创建的索引字段,1为指定按升序创建索引,如果你想按降序来创建索引指定为-1即可。

创建索引需要考虑的问题

  1. 会做什么样的查询?其中那些查询会需要索引

  2. 每个键的索引方向是什么?(倒序还是逆序)

  3. 如何应对扩展?有没有不用的键排列可以使常用的数据更多的保留在内存中

对某个创建的索引查询会加速,而对于其他查询可能没有帮助。

扩展索引

使用多个字段创建索引, 例如: db.col.createIndex({"title":1,"description":-1}) ,对titile(升序) 和 description(降序) 创建了联合索引

explain 和 hint

explain: 返回查询使用的索引情况、耗时以及扫描的文档的统计信息

hint: 强制使用索引

聚合 Aggregate

MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。aggregate() 方法的基本语法格式如下所示:

db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

例子:

db.orders.aggregate([
   { $match: { status: "A" } },
   { $group: { _id: "$cust_id", total: { $sum: "$amount" } } }
])

相当于 SQL: select sum(amount) from orders where status='A' group by cust_id;

更多的 SQL和 MONGO Agg 对比关系: https://docs.mongodb.com/manual/reference/sql-aggregation-comparison/

管道的概念

管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。

聚合常见的操作:

  • $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
  • m a t c h : 用 于 过 滤 数 据 , 只 输 出 符 合 条 件 的 文 档 。 match:用于过滤数据,只输出符合条件的文档。 matchmatch使用MongoDB的标准查询操作。
  • $limit:用来限制MongoDB聚合管道返回的文档数。
  • $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
  • $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
  • $group:将集合中的文档分组,可用于统计结果。
  • $sort:将输入文档排序后输出。

进阶

复制集

MongoDB复制是将数据同步在多个服务器的过程。

复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。

复制还允许您从硬件故障和服务中断中恢复数据。

分片

在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求。

当MongoDB存储海量的数据时,一台机器可能不足以存储数据也足以提供可接受的读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。

正则表达式

>db.test.find({text:{$regex:"test"}})

或者:

>db.test.find({text:/test/})

docker 使用 mongo

  • 下载mongo镜像
docker pull mongo
  • 启动Mongo实例:
docker run -p 27017:27017 -v <LocalDirectoryPath>:/data/db --name mongodb -d mongo
docker run -p 27017:27017 -v ~/data/docker/mongo:/data/db --name mongodb -d mongo

docker 命令

  • 查看容器
docker ps
  • 删除容器
docker rm mongodb
  • 停止容器
docker stop mongodb
  • 进入容器
docker exec -it mongodb bash

推荐阅读

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CoLiuRs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值