MongoDB 主键_id 改 id

在 MongoDB 中,每个文档(document)都有一个唯一标识符,称为主键(_id),用于唯一标识文档。默认情况下,_id 是一个 ObjectId 类型的字段,其值由 MongoDB 自动生成。但有时候我们希望使用自定义的字段作为主键,比如使用 id 字段作为主键。本文将介绍如何在 MongoDB 中将 _id 改为 id。

为什么要将 _id 改为 id

在某些情况下,我们可能希望使用自定义字段作为主键,而不是 MongoDB 自动生成的 ObjectId。比如,我们从其他数据库迁移数据到 MongoDB 中,原数据库的数据中已经有了一个唯一标识符 id,我们希望在迁移过程中保持一致性。又或者我们希望将主键字段改为较短的字段,减少存储空间。

将 _id 改为 id 的方法

要将 _id 改为 id,可以通过以下步骤实现:

1. 创建集合时设置主键

在创建集合时,可以通过指定文档的_id字段为 id,来将_id改为id。例如:

db.createCollection("myCollection", {
   validator: { $jsonSchema: {
      bsonType: "object",
      required: [ "id", "name" ],
      properties: {
         id: {
            bsonType: "int",
            description: "must be an integer and is required"
         },
         name: {
            bsonType: "string",
            description: "must be a string and is required"
         }
      }
   }}
})

2. 更新文档中的_id字段

如果已经存在的文档中需要将 _id 改为 id,可以通过更新操作实现。例如:

db.myCollection.find().forEach(function(doc) {
   db.myCollection.update(
      { _id: doc._id },
      { $set: { id: doc._id } }
   );
});

3. 删除原_id字段

最后,还需要删除原来的_id字段,以免造成混淆。例如:

db.myCollection.updateMany({}, { $unset: { _id: "" } });

序列图示例

下面是一个使用自定义 id 作为主键的序列图示例:

sequenceDiagram
    participant Client
    participant MongoDB

    Client->>MongoDB: 创建文档 { id: 1, name: "Alice" }
    MongoDB-->>Client: 返回成功

    Client->>MongoDB: 查询文档 { id: 1 }
    MongoDB-->>Client: 返回文档 { id: 1, name: "Alice" }

    Client->>MongoDB: 更新文档 { id: 1, name: "Bob" }
    MongoDB-->>Client: 返回成功

    Client->>MongoDB: 删除文档 { id: 1 }
    MongoDB-->>Client: 返回成功

结语

本文介绍了如何在 MongoDB 中将 _id 改为 id,以及为什么需要进行这样的操作。通过以上步骤,我们可以方便地实现使用自定义字段作为主键的需求。在实际应用中,根据具体情况选择最适合的方式来处理主键字段,以达到更好的数据管理和查询效果。