当前位置: 代码网 > it编程>数据库>mongodb > 映射MongoDB _id字段的几种常见方式

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

2025年05月22日 mongodb 我要评论
在spring datamongodb 中,将 java pojo 的字段映射到 mongodb 文档的_id字段非常直接,主要通过@id注解(org.springframework.data.ann

在 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字段的资料请关注代码网其它相关文章!

(0)

相关文章:

  • 在Linux上从源码编译安装MongoDB的操作流程

    在Linux上从源码编译安装MongoDB的操作流程

    在linux上从源码编译安装mongodb需要以下步骤:1.克隆并切换到特定版本的mongodb源码;2.安装必要的依赖并配置编译环境;3.编译mongodb并... [阅读全文]
  • mongodb创建的数据库在哪里

    mongodb创建的数据库在哪里

    mongodb 数据库的数据存储在指定的数据目录中,该目录可以位于本地文件系统、网络文件系统或云存储中,具体位置如下:本地文件系统:默认路径为 linux/ma... [阅读全文]
  • mongodb数据库文件在哪

    mongodb数据库文件在哪

    mongodb 数据库文件位于 mongodb 数据目录中,默认情况下为 /data/db,其中包含 .bson(文档数据)、ns(集合信息)、journal(... [阅读全文]
  • mongodb数据存储在哪

    mongodb数据存储在哪

    mongodb 采用分片集群架构,分片存储特定范围的数据,分片规则定义数据分布方式。副本集作为冗余机制,确保数据可用性。mongodb 使用 bson 格式存储... [阅读全文]
  • mongodb一般用哪个版本

    mongodb一般用哪个版本

    推荐使用 mongodb 最新版本(当前为 5.0),因为它提供了最新特性和改进。选择版本时,需考虑功能需求、兼容性、稳定性和社区支持,例如:最新版本具有事务、... [阅读全文]
  • mongodb能存什么

    mongodb能存什么

    mongodb 是一款 nosql 数据库,可存储以下类型的数据:json 文档二进制数据(gridfs)地理空间数据时间序列数据图形数据(通过 graphdb... [阅读全文]

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com