MongoDB 学习笔记(基础)
概论
出现背景:MongoDB 是文档型数据库,由于传统的关系型数据库(如 MySQL),在数据操作的“三高”需求以及应对 web 的网站需求面前显得有些吃力,在此环境下 MongoDB 出世了
三高需求:
(1) 对数据库高并发读写的需求。
(2) 对海量数据的高效率存储和访问的需求。
(3) 对数据库的高可扩展性和高可用性的需求。
(MongoDB 是 NoSQL 中最像 SQL 的非关系型数据库)
MongoDB | SQL |
---|---|
Database | Database |
Table | Collection |
Row | Document |
Column | Field |
Key-Value | Field : FieldValue |
Index | Index |
_ID(auto) | ID |
多表连接 | 嵌入文档 |
(MongoDB 默认为每个文档设置了一个主键 _ID,默认下它是 Objectid 对象,它在集合中是唯一标识的)
MongoDB 有如下三个自带的数据库:
- admin 数据库:用于存储用户和角色等信息
- local 数据库:用来存储副本集的配置信息,数据不能被复制到其它节点
- config 数据库:在分片设置时存储分片的相关信息
数据库自定义命名规范:不能为空或有特殊符合及以数字开头,且对大小写敏感,长度最多为 64B(如果用户不定义自己的数据库名称,则默认操作数据库名称为 test)
MongoDB 支持的数据结构非常松散,其记录是一个文档(由键值对 field:value 组成),文档类似于 JSON 对象
数据库管理
创建数据库(如果此数据库已存在则切换到指定数据库,而实际上只有向其插入文档时才会真正创建)
use DATABASE_NAME
显示数据库
show dbs
删除数据库
db.dropDatabase()
集合管理
创建集合
db.createCollection(name, options)
查看集合
show collections 或 show tables
删除集合
db.COLLECTION_NAME.drop()
创建集合的注释:
- name:要创建的集合名称
- options:可选项
- capped:是否是固定大小集合
- autoIndexId:是否自动在 _ID 键名上创建索引
- size:定义固定集合的大小,单位是 千字节(Kbytes)
- max:固定集合文档的最大数量
文档管理
插入文档
db.COLLECTION_NAME.insert(document_name)
单插入文档
db.COLLECTION_NAME.insertOne(document_name)
多插入文档
db.COLLECTION_NAME.insertMany([<document_name1>, <document_name2>, ···], {writeConcern: <1|0>, ordered: <true|false>})
更新文档
db.COLLECTION_NAME.update(<query>, <update>, {upset: <boolean>, multi: <boolean>, writeConcern: <document>})
db.COLLECTION_NAME.save(<document>)
删除文档
db.COLLECTION_NAME.remove()
db.COLLECTION_NAME.deleteOne()
db.COLLECITON_NAME.deleteMany()
查询文档
db.COLLECTION_NAME.find()
db.COLLECTION_NAME.find().pretty()
限定查询数量
db.COLLECTION_NAME.find().limit(Num)
查询结果排序
db.COLLECTION_NAME.find().sort({KEY:1|-1})
多插入文档的注释:
- writeConcern:指定写入策略,1 要求确认写,为 0 则不要求
- ordered:指定是否按顺序写入,true 要求按顺序写入,为 false 则不要求
更新文档的注释:
- query:更新的条件/对象
- update:更新的对象和更新的操作符
- {$set:{field:value}} 把文档中某个 field 的值设置为 value
- {$inc:{field:value}} 把文档中某个数值型的 field 增加一次 value 值
- {$unset:{field:0}} 删除某个 field
- {$push:{field:value}} 把 value 追加到数组 field 中,如果数组 field 不存在,则会自动插入一个数组类型
- {$addToSet:{field:value}} 加一个值到数组 field 中,而且只有当这个值在数组中不存在时才增加
- {$pull:{field:value}} 从数组 field 中删除一个等于 value 的值
- {$rename:{old_field_name:new_field_name}} 对 field 进行重命名
- upsert:可选参数,如果不存在 update 的记录,是否插入新文档,true为插入,默认是false,不插入
- multi:可选参数,默认是 false,只更新找到的第一条记录;如果这个参数为 true,就把按条件查出来的多条记录全部更新
- writeConcern:可选参数,抛出异常的级别
文档聚合
db.COLLECTION_NAME.aggregate( [{$pipeline1}, {$pipeline2}, {$pipeline3}···] )
其中的 $pipeline1 等都被称作管道命令
- $match:指定条件过滤
- $group:指定键分组
- $sum:求和
- $avg:平均
- $min:最小值
- $max:最大值
- $push:将结果插到数组中,且去掉重复值
- $addToSet:将结果插入到数组
- $first:返回第一个文档数据
- $last:返回最后一个文档数据
- $project:投影
- $limit:限定
- $skip:跳过
- unwind:分解
- sort:排序
MongoDB——》聚合查询(project、match、limit、skip、unwind、group、sort)_mongo match limit-CSDN博客
文档索引
db.COLLECTION_NAME.createIndex(keys, options)
查看索引
db.COLLECTION_NAME.getIndexes()
查看索引大小
db.COLLECTION_NAME.totalIndexSize()
删除指定索引
db.COLLECTION_NAME.dropIndex("索引名称")
删除所有索引
db.COLLECTION_NAME.dropIndexes()