学习笔记:MongoDB

发布于:2025-06-13 ⋅ 阅读:(15) ⋅ 点赞:(0)

目录

数据库 (databases) 管理语法

集合 (collection) 管理语法

基本常用命令

文档基本 CRUD

Insert

Read

find

Delete

update

修改操作符

文档间的关系

排序&分页&投影(Sort&Skip、Limit&Projection)

sort

skip、limit

聚合查询

常用管道

常用表达式

索引


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()