mongodb 基础概念以及常用命令记录-01
mongodb 数据库
MongoDB 是一个文档型数据库,数据以类似 JSON 的文档形式存储。
MongoDB 的设计理念是为了应对大数据量、高性能和灵活性需求。
MongoDB使用集合(Collections)来组织文档(Documents),每个文档都是由键值对组成的。
- 数据库(Database):存储数据的容器,类似于关系型数据库中的数据库。
- 集合(Collection):数据库中的一个集合,类似于关系型数据库中的表。
- 文档(Document):集合中的一个数据记录,类似于关系型数据库中的行(row),以 BSON 格式存储。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成,文档类似于 JSON 对象,字段值可以包含其他文档,数组及文档数组:
完整术语列表:
- 文档(Document):MongoDB 的基本数据单元,通常是一个 JSON-like 的结构,可以包含多种数据类型。
- 集合(Collection):类似于关系型数据库中的表,集合是一组文档的容器。在 MongoDB 中,一个集合中的文档不需要有一个固定的模式。
- 数据库(Database):包含一个或多个集合的 MongoDB 实例。
- BSON:Binary JSON 的缩写,是 MongoDB 用来存储和传输文档的二进制形式的 JSON。
- 索引(Index):用于优化查询性能的数据结构,可以基于集合中的一个或多个字段创建索引。
- 分片(Sharding):一种分布数据到多个服务器(称为分片)的方法,用于处理大数据集和高吞吐量应用。
- 副本集(Replica Set):一组维护相同数据集的 MongoDB 服务器,提供数据的冗余备份和高可用性。
- 主节点(Primary):副本集中负责处理所有写入操作的服务器。
- 从节点(Secondary):副本集中的服务器,用于读取数据和在主节点故障时接管为主节点。
- MongoDB Shell:MongoDB 提供的命令行界面,用于与 MongoDB 实例交互。
- 聚合框架(Aggregation Framework):用于执行复杂的数据处理和聚合操作的一系列操作。
- Map-Reduce:一种编程模型,用于处理大量数据集的并行计算。
- GridFS:用于存储和检索大于 BSON 文档大小限制的文件的规范。
- ObjectId:MongoDB 为每个文档自动生成的唯一标识符。
- CRUD 操作:创建(Create)、读取(Read)、更新(Update)、删除(Delete)操作。
- 事务(Transactions):从 MongoDB 4.0 开始支持,允许一组操作作为一个原子单元执行。
- 操作符(Operators):用于查询和更新文档的特殊字段。
- 连接(Join):MongoDB 允许在查询中使用
$lookup操作符来实现类似 SQL 的连接操作。 - TTL(Time-To-Live):可以为集合中的某些字段设置 TTL,以自动删除旧数据。
- 存储引擎(Storage Engine):MongoDB 用于数据存储和管理的底层技术,如 WiredTiger 和 MongoDB 的旧存储引擎 MMAPv1。
- MongoDB Compass:MongoDB 的图形界面工具,用于可视化和管理 MongoDB 数据。
- MongoDB Atlas:MongoDB 提供的云服务,允许在云中托管 MongoDB 数据库。
需要注意的是:
- 文档中的键/值对是有序的。
- 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
- MongoDB区分类型和大小写。
- MongoDB的文档不能有重复的键。
- 文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。
文档键命名规范:
- 键不能含有\0 (空字符)。这个字符用来表示键的结尾。
- .和$有特别的意义,只有在特定环境下才能使用。
- 以下划线"_"开头的键是保留的(不是严格要求的)。
Capped collections
固定大小的collection。
它有很高的性能以及队列过期的特性(过期按照插入的顺序). 有点和 "RRD" 概念类似。
Capped collections 是高性能自动的维护对象的插入顺序。它非常适合类似记录日志的功能和标准的 collection 不同,你必须要显式的创建一个capped collection,指定一个 collection 的大小,单位是字节。collection 的数据存储空间值提前分配的。
Capped collections 可以按照文档的插入顺序保存到集合中,而且这些文档在磁盘上存放位置也是按照插入顺序来保存的,所以当我们更新Capped collections 中文档的时候,更新后的文档不可以超过之前文档的大小,这样话就可以确保所有文档在磁盘上的位置一直保持不变。
由于 Capped collection 是按照文档的插入顺序而不是使用索引确定插入位置,这样的话可以提高增添数据的效率。MongoDB 的操作日志文件 oplog.rs 就是利用 Capped Collection 来实现的。
要注意的是指定的存储大小包含了数据库的头信息。
常用命令记录:
cls 清屏
show dbs 数据库查询
exit() shell 连接方式 退出命令行
use xx 使用哪个数据库
创建用户:
db.createUser({
user: "testuser",
pwd: "password123",
roles: [
{ role: "readWrite", db: "<database_name>" },
{ role: "dbAdmin", db: "<database_name>" }
]
})
验证用户
db.auth("testuser", "password123")
登录用户
mongosh --host <hostname> --port <port> -u "testuser" -p "password123" --authenticationDatabase "<database_name>"
删除用户
db.dropUser("testuser")
使用数据库
use DATABASE_NAME
创建集合
db.createCollection(name, options)
option 参数:
capped |
布尔值 | 是否创建一个固定大小的集合。 | true |
|---|---|---|---|
size |
数值 | 集合的最大大小(以字节为单位)。仅在 capped 为 true 时有效。 |
10485760 (10MB) |
max |
数值 | 集合中允许的最大文档数。仅在 capped 为 true 时有效。 |
5000 |
validator |
对象 | 用于文档验证的表达式。 | { $jsonSchema: { ... }} |
validationLevel |
字符串 | 指定文档验证的严格程度。 "off":不进行验证。 "strict":插入和更新操作都必须通过验证(默认)。 "moderate":仅现有文档更新时必须通过验证,插入新文档时不需要。 |
"strict" |
validationAction |
字符串 | 指定文档验证失败时的操作。 "error":阻止插入或更新(默认)。 "warn":允许插入或更新,但会发出警告。 |
"error" |
storageEngine |
对象 | 为集合指定存储引擎配置。 | { wiredTiger: { ... }} |
collation |
对象 | 指定集合的默认排序规则。 | { locale: "en", strength: 2 } |
use myNewDatabase
db.createCollection("myNewCollection")
更新集合名称:
-
dropTarget(可选):布尔值。如果目标集合已经存在,是否删除目标集合。默认值为
false。 -
权限要求:执行
renameCollection命令需要具有对源数据库和目标数据库的适当权限。通常需要dbAdmin或dbOwner角色。 -
索引和数据:重命名集合会保留所有文档和索引。
db.adminCommand({
renameCollection: "sourceDb.sourceCollection",
to: "targetDb.targetCollection",
dropTarget: <boolean>
})
删除数据库
use myDatabase
db.dropDatabase()
删除集合
db.collection.drop()
插入文档
| 方法 | 用途 | 是否弃用 |
|---|---|---|
insertOne() |
插入单个文档 | 否 |
insertMany() |
插入多个文档 | 否 |
insert() |
插入单个或多个文档 | 是 |
save() |
插入或更新文档 | 是 |
db.collection.insertOne(document, options)
示例:
db.userTest.insertOne({"username": "adam", "pwd": "123123"})
db.collection.save(document, options)
save() 方法在插入文档时表现得类似于 insertOne()。
如果文档包含 _id 字段且已存在,则该文档会被更新;如果文档不包含 _id 字段或 _id 不存在,则会插入一个新文档。
从 MongoDB 4.2 开始,db.collection.save() 已被标记为弃用(deprecated),官方推荐使用 db.collection.insertOne() 或 db.collection.replaceOne() 替代。
批量插入的性能优化
如果需要插入大量文档,可以使用 insertMany() 并启用 ordered: false 选项,以提高插入性能。
语法:
db.collection.insertMany([document1, document2, ...], { ordered: false })
参数:
ordered: false:表示无序插入,即使某个文档插入失败,也不会影响其他文档的插入。
db.userTest.insertMany([{"username": "adam1", "age": 1, "pwd": "12311"},
{"username": "adam2", "age": 11, "pwd":"2"}],
{ordered: false},
validator: {
age: { $gt: 0 }
})
MongoDB 更新文档
updateOne() 方法用于更新匹配过滤器的单个文档。
语法:
db.collection.updateOne(filter, update, options)
- filter:用于查找文档的查询条件。
- update:指定更新操作的文档或更新操作符。
- options:可选参数对象,如
upsert、arrayFilters等。
db.myCollection.updateOne(
{ name: "Alice" }, // 过滤条件
{ $set: { age: 26 } }, // 更新操作
{ upsert: false } // 可选参数
);
updateMany() 方法用于更新所有匹配过滤器的文档。
语法:
db.collection.updateMany(filter, update, options)
- filter:用于查找文档的查询条件。
- update:指定更新操作的文档或更新操作符。
- options:可选参数对象,如
upsert、arrayFilters等。
db.myCollection.updateMany(
{ age: { $lt: 30 } }, // 过滤条件
{ $set: { status: "active" } }, // 更新操作
{ upsert: false } // 可选参数
);
findOneAndUpdate() 方法用于查找并更新单个文档,可以选择返回更新前或更新后的文档。
语法:
db.collection.findOneAndUpdate(filter, update, options)
- filter:用于查找文档的查询条件。
- update:指定更新操作的文档或更新操作符。
- options:可选参数对象,如
projection、sort、upsert、returnDocument等。
db.myCollection.findOneAndUpdate(
{ name: "Charlie" }, // 过滤条件
{ $set: { age: 36 } }, // 更新操作
{ returnDocument: "after" } // 可选参数,返回更新后的文档
);
MongoDB的writeConcern模式简单地可以理解为决定一个写操作落到多少个节点上才算是成功。writerConcern的取值包括:
- 0:发起写操作,不关心是否成功
- 1: 默认值,需要等待primary节点完成写操作就可以返回确认写成功的消息
- n:表示写操作需要被复制到指定节点数才算成功
- majority:写操作需要被复制到大多数节点上才算成功
MongoDB 删除文档
在前面的几个章节中我们已经学习了 MongoDB 中如何为集合添加数据和更新数据,在本章节中我们将继续学习 MongoDB 集合的删除。
常用的删除文档方法包括 deleteOne()、deleteMany() 以及 findOneAndDelete()。
使用场景:
- 数据清理:删除不再需要的旧数据或无效数据。
- 数据修正:在数据修正过程中删除错误的或重复的文档。
- 自动化任务:在自动化脚本或任务中,根据特定条件删除文档。
删除操作的选项
这些删除方法的 options 参数通常可以包含以下选项:
- writeConcern:指定写操作的确认级别。
- collation:指定比较字符串时使用的排序规则。
- projection(仅适用于
findOneAndDelete):指定返回的字段。 - sort(仅适用于
findOneAndDelete):指定排序顺序以确定要删除的文档。
方法用于删除匹配过滤器的单个文档。
语法:
db.collection.deleteOne(filter, options)
- filter:用于查找要删除的文档的查询条件。
- options(可选):一个可选参数对象。
deleteMany() 方法用于删除所有匹配过滤器的文档。
语法:
db.collection.deleteMany(filter, options)
- filter:用于查找要删除的文档的查询条件。
- options(可选):一个可选参数对象。
findOneAndDelete() 方法用于查找并删除单个文档,并可以选择返回删除的文档。
语法:
db.collection.findOneAndDelete(filter, options)
- filter:用于查找要删除的文档的查询条件。
- options:可选参数对象,如
projection、sort等。
MongoDB 查询文档
MongoDB 查询文档使用 find()、findOne() 方法。
find() 方法以非结构化的方式来显示所有文档。
语法
MongoDB 查询数据的语法格式如下:
db.collection.find(query, projection)
- query:用于查找文档的查询条件。默认为
{},即匹配所有文档。 - projection(可选):指定返回结果中包含或排除的字段。
findOne() 方法用于查找集合中的单个文档。如果找到多个匹配的文档,它只返回第一个。
语法:
db.collection.findOne(query, projection)
- query:用于查找文档的查询条件。默认为
{},即匹配所有文档。 - projection(可选):指定返回结果中包含或排除的字段。
高级查询方法
1、使用比较操作符
MongoDB 支持多种比较操作符,如 \(gt、\)lt、\(gte、\)lte、\(eq、\)ne 等。
查找年龄大于 25 的文档:
db.myCollection.find({ age: { $gt: 25 } });
2、使用逻辑操作符
MongoDB 支持多种逻辑操作符,如 \(and、\)or、\(not、\)nor 等。
查找年龄大于 25 且城市为 "New York" 的文档:
实例
db.myCollection.find({
$and: [
{ age: { $gt: 25 } },
{ city: "New York" }
]
});
3、使用正则表达式
可以使用正则表达式进行模式匹配查询。
查找名字以 "A" 开头的文档:
db.myCollection.find({ name: /^A/ });
4、投影
投影用于控制查询结果中返回的字段。可以使用包含字段和排除字段两种方式。
只返回名字和年龄字段:
实例
db.myCollection.find(
{ age: { $gt: 25 } },
{ name: 1, age: 1, _id: 0 }
);
5、排序
可以对查询结果进行排序。
按年龄降序排序:
db.myCollection.find().sort({ age: -1 });
6、限制与跳过
可以对查询结果进行限制和跳过指定数量的文档。
返回前 10 个文档:
db.myCollection.find().limit(10);
跳过前 5 个文档,返回接下来的 10 个文档:
db.myCollection.find().skip(5).limit(10);
MongoDB AND 条件
MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。
语法格式如下:
>db.col.find({key1:value1, key2:value2}).pretty()
仅做个人学习记录,内容来源:
https://www.runoob.com/mongodb/mongodb-tutorial.html

浙公网安备 33010602011771号