MongoDB:掌握全新标识符ID

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字段。

数据库标签