1. MongoDB简介
MongoDB是一种高性能、开源、面向文档的NoSQL数据库。它将数据存储在类似JSON的文档中,因此可以快速处理数据,而不需要深入了解复杂的关系和JOIN操作。
相对于关系型数据库,MongoDB可以更好地处理非结构化或半结构化数据,并通过自动缩放和高可用性功能提供更好的可扩展性。
2. MongoDB架构
MongoDB由多个组件组成,如下所示:
2.1 MongoDB实例
MongoDB实例包括一个或多个mongod进程。每个mongod进程负责在磁盘上存储和检索数据。实例可以在单个计算机上运行,也可以在多个计算机上分布式运行。
2.2 MongoDB副本集
MongoDB副本集是一组mongod进程的集合,它们存储相同的数据。其中一个mongod进程被指定为主节点,而其他进程被指定为从节点。主节点负责处理写入操作,而从节点负责复制主节点上的更改。如果主节点退出,从节点中的一个将被提升为主节点。这种设计提供了高可用性:如果一个节点崩溃,则系统仍然可以继续运行。
2.3 MongoDB分片集群
MongoDB分片集群是由多个mongod进程组成的集合,它们存储跨多个计算机的大型数据集。数据集被分割成多个片,并在不同的计算机上存储。每个片都可以是一个副本集。在查询数据时,MongoDB将数据自动路由到正确的片。这种设计可以提高数据读写的并发性。
3. MongoDB文档
MongoDB使用文档来存储和表示数据。文档基本上是键值对的集合,其中键是字符串,值可以是各种类型的数据。MongoDB将文档存储在集合中。集合类似于关系型数据库中的表,而文档类似于表中的行。
4. MongoDB ID
MongoDB文档具有一个名为_id的特殊字段,用于唯一标识每个文档。如果创建文档时未提供_id字段,则MongoDB自动生成一个ObjectId值作为该文档的_id。
{
"name": "John Doe",
"age": 25,
}
上面的示例文档包含两个字段:name和age。如果将其插入到名为users的集合中,则MongoDB将自动生成一个_id字段。
db.users.insertOne({
"name": "John Doe",
"age": 25,
})
但是,在某些情况下,您可能希望控制生成的_id值。例如,如果要将数据集合到一个较大的数据集中,您可能需要生成_id值,以便使用该值来关联不同的数据源。在这种情况下,您可以提供自定义的_id值。
5. MongoDB自定义ID
可以在插入文档时手动指定_id字段,该字段具有任意类型的值。例如,如果您希望使用自定义字符串作为_id值,则可以执行以下操作:
db.users.insertOne({
"_id": "john_doe_123",
"name": "John Doe",
"age": 25,
})
在这种情况下,要求“_id”是一个唯一的字符串值。如果尝试插入具有相同_id值的另一个文档,则插入操作将失败。
6. MongoDB查询指定ID
要查询具有特定_id值的文档,请使用如下所示的查询:
db.users.find({
"_id": ObjectId("5f7d09058dbcee8635dffd90")
})
请注意,_id值必须是ObjectId类型。要将字符串转换为ObjectId,请使用以下命令:
ObjectId("5f7d09058dbcee8635dffd90")
这将返回一个ObjectId对象,可以用作查询中的_id值。
7. MongoDB修改指定ID
要修改具有特定_id值的文档,请使用如下所示的updateOne命令:
db.users.updateOne(
{"_id": ObjectId("5f7d09058dbcee8635dffd90")},
{$set: {"age": 26}}
)
这将更新_id为“5f7d09058dbcee8635dffd90”的用户的年龄字段。
8. MongoDB删除指定ID
要删除具有特定_id值的文档,请使用如下所示的deleteOne命令:
db.users.deleteOne(
{"_id": ObjectId("5f7d09058dbcee8635dffd90")}
)
这将从集合中删除_id为“5f7d09058dbcee8635dffd90”的文档。
9. 总结
本文介绍了MongoDB的基本概念,包括文档、集合和ID。您学习了如何使用自动或自定义ID为MongoDB文档分配唯一标识符。您还学习了如何在查询、更新和删除文档时使用_id字段。