映射MongoDB _id字段的几种常见方式

 更新时间:2025年05月22日 09:42:19   作者:冰糖心书房  
在 Spring Data MongoDB 中,将 Java POJO 的字段映射到 MongoDB 文档的 _id 字段非常直接,主要通过 @Id 注解(org.springframework.data.annotation.Id)来完成,本文介绍了映射 MongoDB _id 字段的几种常见方式和关键点,需要的朋友可以参考下

在 Spring Data MongoDB 中,将 Java POJO 的字段映射到 MongoDB 文档的 _id 字段非常直接,主要通过 @Id 注解(org.springframework.data.annotation.Id)来完成。

以下是映射 MongoDB _id 字段的几种常见方式和关键点:

1、使用 String 类型作为 ID (最常见):

  • 当 @Id 注解的字段类型是 String 时,Spring Data MongoDB 会将其视为 MongoDB ObjectId 的字符串表示形式。
  • 如果在保存新文档时此 String 字段为 null,MongoDB Java 驱动程序会自动生成一个新的 ObjectId,然后 Spring Data MongoDB 会将其转换为字符串并赋值给该字段。
  • 这是最推荐和最方便的方式,因为字符串形式的 ID 更容易在 API、URL 和日志中使用。
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "my_entities")
public class MyEntity {

    @Id
    private String id; // 将映射到 MongoDB 的 _id 字段

    private String name;

    // Constructors, getters, setters
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

当你保存一个新的 MyEntity 实例且 id 字段为 null 时:

MyEntity entity = new MyEntity();
entity.setName("Test Entity");
mongoTemplate.save(entity); // entity.getId() 现在会有一个自动生成的 ObjectId 字符串
System.out.println(entity.getId()); // 例如:"60c72b941f4b1a3e4c8e4f3a"

2、使用 org.bson.types.ObjectId 类型作为 ID:

  • 你可以直接使用 MongoDB BSON库提供的 ObjectId 类型。
  • 同样,如果在保存新文档时此 ObjectId 字段为 null,驱动程序会自动生成一个新的 ObjectId
import org.bson.types.ObjectId;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "products")
public class Product {

    @Id
    private ObjectId id; // 直接使用 ObjectId 类型

    private String productName;

    // Constructors, getters, setters
    public ObjectId getId() {
        return id;
    }

    public void setId(ObjectId id) {
        this.id = id;
    }

    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }
}

3、使用其他 Java 类型作为 ID (例如 Long, BigInteger):

  • 你也可以使用其他原始类型或对象类型(如 LongBigInteger)作为 _id
  • 重要: 如果使用这些类型,MongoDB 不会自动为你生成 ID。你必须在保存文档之前自己提供一个唯一的 ID 值。如果插入时该字段为 null (对于对象类型) 或默认值 (对于原始类型且你未设置),可能会导致错误或意外行为,具体取决于驱动程序和服务器版本。
  • 这种方式适用于你有外部系统生成 ID,或者 ID 具有特定业务含义的情况。
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import java.math.BigInteger;

@Document(collection = "items")
public class Item {

    @Id
    private Long itemId; // 使用 Long 类型,需要自己保证唯一性并赋值

    // 或者
    // @Id
    // private BigInteger itemId; // 使用 BigInteger,需要自己保证唯一性并赋值

    private String description;

    // Constructors, getters, setters
    public Long getItemId() {
        return itemId;
    }

    public void setItemId(Long itemId) {
        this.itemId = itemId;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

使用自定义ID时:

Item item = new Item();
item.setItemId(12345L); // 必须手动设置 ID
item.setDescription("Custom ID Item");
mongoTemplate.save(item);

4、Java 字段名不一定是 “id”:

  • 被 @Id 注解的 Java 字段的名称可以不是 id。Spring Data MongoDB 依然会将其映射到 MongoDB 文档中的 _id 字段。
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "books")
public class Book {

    @Id
    private String bookIsbn; // Java 字段名为 "bookIsbn",但它映射到 MongoDB 的 _id

    private String title;

    // Getters and setters
    public String getBookIsbn() {
        return bookIsbn;
    }

    public void setBookIsbn(String bookIsbn) {
        this.bookIsbn = bookIsbn;
    }
    // ...
}

关键点总结:

  • @Id 注解: 是将 Java 字段标记为 MongoDB _id 的核心。
  • 自动生成:
    • 仅当 @Id 字段类型为 String 或 org.bson.types.ObjectId,并且在插入新文档时该字段值为 null 时,ID 才会由 MongoDB 驱动自动生成。
    • 其他类型(如 LongIntegerBigInteger)需要你在应用程序中手动赋值并确保其唯一性。
  • 不可变性: MongoDB 中的 _id 字段一旦设置,就不能被修改。尝试更新 _id 会导致操作失败或创建一个新文档(取决于操作类型)。
  • 唯一性_id 在其集合中必须是唯一的。MongoDB 会自动为 _id 字段创建唯一索引。
  • @Field("_id"): 通常不需要。@Id 注解本身就隐含了该 Java 字段映射到 BSON 文档的 _id 键。显式使用 @Field("_id") 是多余的。

选择哪种 ID 类型取决于你的具体需求:

  • String (ObjectId 字符串): 通用,方便,推荐用于大多数场景。
  • ObjectId: 如果你需要在 Java 代码中直接操作 ObjectId 对象(例如,获取时间戳部分)。
  • Long / BigInteger / 其他自定义类型: 当 ID 有特定业务含义或由外部系统生成时。

在大多数 Spring Boot 应用中,使用 String 类型并让 MongoDB 自动生成 ObjectId 是最简单和最常见的做法。

以上就是映射MongoDB _id字段的几种常见方式的详细内容,更多关于映射MongoDB的_id字段的资料请关注脚本之家其它相关文章!

相关文章

  • mongodb主从复制_动力节点Java学院整理

    mongodb主从复制_动力节点Java学院整理

    这篇文章主要为大家详细介绍了mongodb主从复制的相关资料,讨论mongodb的部署技术,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • MongoDB中多表关联查询($lookup)的深入讲解

    MongoDB中多表关联查询($lookup)的深入讲解

    NoSql的多表关联一直是比较复杂的问题,下面这篇文章主要给大家介绍了关于MongoDB中多表关联查询($lookup)的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-12-12
  • 在PyCharm中安装Mongo Plugin的详细教程

    在PyCharm中安装Mongo Plugin的详细教程

    这篇文章主要介绍了在PyCharm中安装Mongo Plugin的详细教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • MongoDB的分布式存储架构详解

    MongoDB的分布式存储架构详解

    MongoDB分片技术通过将数据分割存储在多台服务器上,实现数据的分布式存储,满足大数据量的需求,分片架构包括前端路由服务器、配置服务器和分片服务器,本文介绍MongoDB的分布式存储架构,感兴趣的朋友跟随小编一起看看吧
    2025-12-12
  • mongodb基础之用户权限管理实例教程

    mongodb基础之用户权限管理实例教程

    这篇文章主要给大家介绍了关于mongodb基础之用户权限管理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-06-06
  • MongoDB 内存管理相关总结

    MongoDB 内存管理相关总结

    这篇文章主要介绍了MongoDB 内存管理的相关资料,帮助大家更好的理解和学习使用MongoDB数据库,感兴趣的朋友可以了解下
    2021-03-03
  • MongoDB为用户设置访问权限

    MongoDB为用户设置访问权限

    MongoDB已经使用很长一段时间了,基于MongoDB的数据存储也一直没有使用到权限访问 MongoDB默认设置为无权限访问限制
    2012-11-11
  • Windows系统启动MongoDB报错无法连接服务器的问题及解决方案

    Windows系统启动MongoDB报错无法连接服务器的问题及解决方案

    在Windows系统中启动MongoDB时遇到连接拒绝的错误,通常是因为服务未运行或配置问题,本文给大家分享Windows系统启动MongoDB报错无法连接服务器的问题及解决方案,一起看看吧
    2024-10-10
  • 解决MongoDB占用内存过大频繁死机的方法详解

    解决MongoDB占用内存过大频繁死机的方法详解

    这篇文章主要介绍了解决MongoDB占用内存过大频繁死机的方法详解,需要的朋友可以参考下
    2020-02-02
  • MongoDB 插入操作机制详解之insert() 与 nInserted 的行为剖析(推荐)

    MongoDB 插入操作机制详解之insert() 与 nInserted 的行为剖析(推荐)

    本文将以一段常见的MongoDB Shell脚本为切入点,深入探讨insert() 方法的工作机制、返回值含义,并对比insertMany()的差异,帮助开发者避免常见误解,写出更高效、更可控的数据写入代码,感兴趣的朋友一起看看吧
    2025-11-11

最新评论