在 spring data mongodb 中,将 java pojo 的字段映射到 mongodb 文档的 _id 字段非常直接,主要通过 @id 注解(org.springframework.data.annotation.id)来完成。
以下是映射 mongodb _id 字段的几种常见方式和关键点:
1、使用 string 类型作为 id (最常见):
- 当
@id注解的字段类型是string时,spring data mongodb 会将其视为 mongodbobjectid的字符串表示形式。 - 如果在保存新文档时此
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):
- 你也可以使用其他原始类型或对象类型(如
long,biginteger)作为_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 驱动自动生成。 - 其他类型(如
long,integer,biginteger)需要你在应用程序中手动赋值并确保其唯一性。
- 仅当
- 不可变性: 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字段的资料请关注代码网其它相关文章!
发表评论