BSON类型
BSON 是一种二进制序列化格式,用于在 MongoDB 中存储文档和进行远程过程调用。
| 类型 | 数值 | 别名 | 注意 |
|---|---|---|---|
| 双精度 | 1 | "double" | |
| 字符串 | 2 | "string" | |
| 对象 | 3 | "object" | |
| 阵列 | 4 | "array" | |
| 二进制数据 | 5 | "binData" | |
| 未定义 | 6 | "undefined" | 已弃用。 |
| ObjectId | 7 | "objectId" | |
| 布尔 | 8 | "bool" | |
| Date | 9 | "date" | |
| null | 10 | "null" | |
| 正则表达式 | 11 | "regex" | |
| 数据库指针 | 12 | "dbPointer" | 已弃用。 |
| JavaScript | 13 | "javascript" | |
| 符号 | 14 | "symbol" | 已弃用。 |
| 32 位整数 | 16 | "int" | |
| 时间戳 | 17 | "timestamp" | |
| 64 位整型 | 18 | "long" | |
| Decimal128 | 19 | "decimal" | |
| 最小键 | -1 | "minKey" | |
| Max key | 127 | "maxKey" |
创建数据库
使用 use 命令来指定一个数据库时,如果该数据库不存在,MongoDB将自动创建它
查看数据库列表
show dbs
查看当前数据库
db
删除数据库
db.dropDatabase() //将删除当前正在使用的 myDatabase 数据库及其所有集合
集合
创建数据库后,通常需要在其中创建集合(collections)
MongoDB 中默认的数据库为test
集合创建方法
db.createCollection('集合名字')
查看已有集合
show collections //或 show tables
重命名集合
db.adminCommand({
renameCollection: "sourceDb.sourceCollection",
to: "targetDb.targetCollection",
dropTarget: <boolean> // 可选,如果目标集合已经存在,是否删除目标集合。默认值为 `false`。
})
删除集合
db.collection(集合名字).drop()
文档
文档(documents)
- db.collection.insertOne():插入单个文档
- db.collection.insertMany():插入多个文档
- db.collection.save():类似于 insertOne()。如果文档存在,则该文档会被更新;如果文档不存在,则会插入一个新文档。
db.collection.insertOne(document, options)
db.collection.insertMany(documents, options)
db.collection.save(document, options)
options:
- ordered(仅适用于 insertMany):布尔值。如果为 true,则按顺序插入文档,在遇到错误时停止;如果为 false,则尝试插入所有文档,即使遇到错误也继续。默认值为 true。
- writeConcern:指定写操作的确认级别。
- bypassDocumentValidation:布尔值。如果为 true,则忽略集合的文档验证规则。
查看已插入文档:
db.collection.find()
更新文档
在 MongoDB 中,更新文档的操作可以使用多种方法实现,常用的方法包括 updateOne()、updateMany()、replaceOne() 和 findOneAndUpdate() 。
db.collection.updateOne(filter, update, options)
- filter:用于查找文档的查询条件。
- update:指定更新操作的文档或更新操作符。
- options:可选参数对象,如
upsert、arrayFilters等
字段更新操作符:
| 名称 | 说明 |
|---|---|
$currentDate | 将字段的值设置为当前日期,可以是日期或时间戳。 |
$inc | 将字段的值按指定量递增。 |
$min | 仅当指定值小于现有字段值时才更新字段。 |
$max | 仅当指定值大于现有字段值时才更新字段。 |
$mul | 将字段的值乘以指定量。 |
$rename | 重命名字段。 |
$set | 设置文档中字段的值。 |
$setOnInsert | 如果某一更新操作导致插入文档,则设置字段的值。对修改现有文档的更新操作没有影响。 |
$unset | 从文档中删除指定的字段。 |
options 参数通常可以包含以下选项:
- upsert:如果没有匹配的文档,是否插入一个新文档。
- arrayFilters:当更新嵌套数组时,指定应更新的数组元素的条件。
- collation:指定比较字符串时使用的排序规则。
- returnDocument:在 findOneAndUpdate 中使用,指定返回更新前 ("before") 或更新后 ("after") 的文档。
删除文档
db.collection.deleteOne() | 即使多个文档可能与指定筛选器匹配,最多也只删除与指定筛选器匹配的单个文档。 |
|---|---|
db.collection.deleteMany() | 删除所有与指定筛选器匹配的文档。 |
db.collection.remove() | 删除与指定过滤器匹配的单个文档或所有文档。 |
查询文档
MongoDB 查询文档使用 find()、findOne() 方法。
db.collection.find(query, projection) //query支持比较运算符,逻辑运算符,正则等
db.myCollection.find().sort({ age: -1 }); // -1降序,1升序
创建索引
db.collection.createIndex( keys, options )
db:数据库的引用。collection:集合的名称。keys:一个对象,指定了字段名和索引的排序方向(1 表示升序,-1 表示降序)。options:一个可选参数,可以包含索引的额外选项。
options 参数是一个对象,可以包含多种配置选项,以下是一些常用的选项:
unique:如果设置为true,则创建唯一索引,确保索引字段的值在集合中是唯一的。background:如果设置为true,则索引创建过程在后台运行,不影响其他数据库操作。name:指定索引的名称,如果不指定,MongoDB 会根据索引的字段自动生成一个名称。sparse:如果设置为true,创建稀疏索引,只索引那些包含索引字段的文档。expireAfterSeconds:设置索引字段的过期时间,MongoDB 将自动删除过期的文档。v:索引版本,通常不需要手动设置。weights:为文本索引指定权重。
聚合
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
下表展示了一些聚合的表达式:
| 表达式 | 描述 | 实例 |
|---|---|---|
| $sum | 计算总和。 | db.mycol.aggregate([{group : {_id : "by_user", num_tutorial : {likes"}}}]) |
| $avg | 计算平均值 | db.mycol.aggregate([{group : {_id : "by_user", num_tutorial : {likes"}}}]) |
| $min | 获取集合中所有文档对应值得最小值。 | db.mycol.aggregate([{group : {_id : "by_user", num_tutorial : {likes"}}}]) |
| $max | 获取集合中所有文档对应值得最大值。 | db.mycol.aggregate([{group : {_id : "by_user", num_tutorial : {likes"}}}]) |
| $push | 将值加入一个数组中,不会判断是否有重复的值。 | db.mycol.aggregate([{group : {_id : "by_user", url : {url"}}}]) |
| $addToSet | 将值加入一个数组中,会判断是否有重复的值,若相同的值在数组中已经存在了,则不加入。 | db.mycol.aggregate([{group : {_id : "by_user", url : {url"}}}]) |
| $first | 根据资源文档的排序获取第一个文档数据。 | db.mycol.aggregate([{group : {_id : "by_user", first_url : {url"}}}]) |
| $last | 根据资源文档的排序获取最后一个文档数据 | db.mycol.aggregate([{group : {_id : "by_user", last_url : {url"}}}]) |
管道的概念
管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。
这里我们介绍一下聚合框架中常用的几个操作:
- $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
- match使用MongoDB的标准查询操作。
- $limit:用来限制MongoDB聚合管道返回的文档数。
- $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
- $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
- $group:将集合中的文档分组,可用于统计结果。
- $sort:将输入文档排序后输出。
- $geoNear:输出接近某一地理位置的有序文档。