目录
排序&分页&投影(Sort&Skip、Limit&Projection)
MongoDB 数据模型是面向文档的, 所谓文档就是一种类似于 JSON 的结构, 简单理解 MongoDB 这个数据库中存在的是各种各样的 JSON(BSON)
- 数据库 (database)
- 数据库是一个仓库, 存储集合 (collection)
- 集合 (collection)
- 类似于数组, 在集合中存放文档
- 文档 (document)
- 文档型数据库的最小单位, 通常情况, 存储和操作的内容都是文档
在 MongoDB 中, 数据库和集合都不需要手动创建, 当我们创建文档时, 如果文档所在的集合或者数据库不存在, 则会自动创建数据库或者集合
数据库 (databases) 管理语法
操作 | 语法 |
---|---|
查看所有数据库 | show dbs; 或 show databases; |
查看当前数据库 | db; |
切换到某数据库 (若数据库不存在则创建数据库) | use <db_name>; |
删除当前数据库 | db.dropDatabase(); |
集合 (collection) 管理语法
操作 | 语法 |
---|---|
查看所有集合 | show collections; |
创建集合 | db.createCollection("<collection_name>"); |
删除集合 | db.<collection_name>.drop() |
基本常用命令
- admin: 从权限角度考虑, 这是
root
数据库, 如果将一个用户添加到这个数据库, 这个用户自动继承所有数据库的权限, 一些特定的服务器端命令也只能从这个数据库运行, 比如列出所有的数据库或者关闭服务器 - local: 数据永远不会被复制, 可以用来存储限于本地的单台服务器的集合 (部署集群, 分片等)
- config: Mongo 用于分片设置时,
config
数据库在内部使用, 用来保存分片的相关信息
文档基本 CRUD
Insert
- 使用
db.<collection_name>.insertOne(documnet)/db.collection.save(document)
向集合中添加一个文档, 参数一个 json 格式的文档 - 使用
db.<collection_name>.insertMany()
向集合中添加多个文档, 参数为 json 文档数组 - $push:用于向数组中添加一个新的元素
- $addToSet:向数组中添加一个新元素(类似于向set集合中添加,如果数组中已经存在了该元素,则添加失败,因为不可重复
Read
db.stus.find({}).count():查询所有结果的数量
- 使用
db.<collection_name>.find()
方法对集合进行查询, 接受一个 json 格式的查询条件. 返回的是一个数组 db.<collection_name>.findOne()
查询集合中符合条件的第一个文档, 返回的是一个对象
可以使用 $in
操作符表示范围查询:
db.collections.find( { status: { $in: [ "A", "D" ] } } )
多个查询条件用逗号分隔, 表示 AND
的关系:
db.collections.find( { status: "A", results: { $lt: 30 } } )
使用 $or
操作符表示后边数组中的条件是OR的关系:
db.collections.find( { $or: [ { status: "A" }, { results: { $lt: 30 } } ] } )
find
find()查询文档时,默认情况是按照_id的值进行升序排列
运算符 | 作用 |
---|---|
$gt | 大于 |
$gte | 大于等于 |
$lt | 小于 |
$lte | 小于等于 |
$ne | 不等于 |
$in | in |
$nin | not in |
Delete
- 使用
db.collection.deleteMany()
方法删除所有匹配的文档. - 使用
db.collection.deleteOne()
方法删除单个匹配的文档. - db.collection.drop():删除集合(如果最后一个集合没了,数据库也没了。。。)
db.dropDatabase()
- 一般数据库中的数据都不会删除,所以删除的方法很少调用,一般会在数据中添加一个字段,来表示数据是否被删除
update
- 使用
db.<collection_name>.updateOne(<filter>, <update>, <options>)
方法修改一个匹配<filter>
条件的文档 - 使用
db.<collection_name>.updateMany(<filter>, <update>, <options>)
方法修改所有匹配<filter>
条件的文档 - 使用
db.<collection_name>.replaceOne(<filter>, <update>, <options>)
方法替换一个匹配<filter>
条件的文档 db.<collection_name>.update(查询对象, 新对象)
默认情况下会使用新对象替换旧对象
- $set:可以用来修改文档中的指定属性
- $unset:可以用来删除文档的指定属性
MongoDB的文档的属性值也可以是一个文档,当一个文档的属性值是文档时,我们称这个文档为内嵌文档
MongoDB支持直接通过内嵌文档的属性进行查询,如果要查询内嵌文档可以则可以通过==.的形式来匹配,且属性名必须使用引号==,双引号单引号都可以
修改操作符
Name | Description |
---|---|
$currentDate | Sets the value of a field to current date, either as a Date or a Timestamp. |
$inc | Increments the value of the field by the specified amount. |
$min | Only updates the field if the specified value is less than the existing field value. |
$max | Only updates the field if the specified value is greater than the existing field value. |
$mul | Multiplies the value of the field by the specified amount. |
$rename | Renames a field. |
$set | Sets the value of a field in a document. |
$setOnInsert | Sets the value of a field if an update results in an insert of a document. Has no effect on update operations that modify existing documents. |
$unset | Removes the specified field from a document. |
文档间的关系
一对一(one to one)
夫妻
在MongoDB中,可以通过内嵌文档的形式来体现出一对一的关系
一对多(one to many)/ 多对一(many to one)
一对多:父母和孩子、用户和订单、文章和评论,也可以通过内嵌文档的方式来映射一对多的关系(将1的那个属性设置为多的里面的字段)
多对多(many to many):分类和商品,通过内嵌文档的方式
排序&分页&投影(Sort&Skip、Limit&Projection)
sort
sort()可以用来指定文档的排序的规则,需要传递一个属性来指定排序规则,1表示升序,-1表示降序
skip、limit
limit(number)
:限制返回的文档数量。skip(number)
:跳过指定数量的文档。
db.collections.find().limit(10) // 返回前 10 条文档
db.collections.find().skip(10).limit(10) // 跳过前 10 条文档,返回接下来的 10 条文档
limit、skip、sort可以任意顺序的调用
查询时,我们可以在第二个参数的位置来设置查询结果的投影
db.users.find({},{sale:1})
聚合查询
- 整个聚合聚合运算过程成为管道(pipline),有多个步骤(stage)组成
db.collections.aggregate([
{管道:{表达式}}
...
])
常用管道
$group | 将集合中的文档分组,用于统计结果 |
---|---|
$match | 过滤数据,只输出符合条件的文档 |
$sort | 聚合数据进一步排序 |
$skip | 跳过指定文档数 |
$limit | 限制集合数据返回文档数 |
$project | 投影,相当于as |
$lookup | 左外连接 |
常用表达式
$sum | 总和($num:1同count表示统计) |
---|---|
$avg | 平均 |
$min | 最小值 |
$max | 最大值 |
索引
创建索引
# 创建索引
db.集合名.createIndex(待创建索引的列:方式 [,额外选项])
# 创建复合索引
db.集合名.createIndex({key1:方式,key2:方式} [,额外选项])
# 参数说明:
- `待创建索引的列:方式`:{key:1}/{key:-1}
1表示升序,-1表示降序; 例如{age:1}表示创建age索引并按照升序方法排列
- `额外选项`:设置索引的名称或者唯一索引等
设置名称:{name:索引名}
唯一索引:{unique:列名}
删除索引
# 删除全部索引
db.集合名.dropIndexes()
# 删除指定索引
db.集合名.dropIndex(索引名)
查看索引
# 查看索引
db.集合名.getIndexes()