15人参与 • 2025-05-22 • mongodb
在 spring data mongodb 中,将 java pojo 的字段映射到 mongodb 文档的 _id
字段非常直接,主要通过 @id
注解(org.springframework.data.annotation.id
)来完成。
以下是映射 mongodb _id
字段的几种常见方式和关键点:
@id
注解的字段类型是 string
时,spring data mongodb 会将其视为 mongodb objectid
的字符串表示形式。string
字段为 null
,mongodb java 驱动程序会自动生成一个新的 objectid
,然后 spring data mongodb 会将其转换为字符串并赋值给该字段。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"
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; } }
long
, biginteger
)作为 _id
。null
(对于对象类型) 或默认值 (对于原始类型且你未设置),可能会导致错误或意外行为,具体取决于驱动程序和服务器版本。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);
@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 驱动自动生成。long
, integer
, biginteger
)需要你在应用程序中手动赋值并确保其唯一性。_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字段的资料请关注代码网其它相关文章!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论