![](/img/trans.png)
[英]How to use spring-data mongodb without objectId to upsert?
[英]Using ObjectId as String in Java (Manual reference) with spring-data mongodb
在 MongoDB 文檔中,他們建議使用 ObjecId 進行手動引用。 請參閱https://docs.mongodb.com/manual/reference/database-references/#document-references
original_id = ObjectId()
db.places.insert({
"_id": original_id,
"name": "Broadway Center",
"url": "bc.example.net"
})
db.people.insert({
"name": "Erin",
"places_id": original_id,
"url": "bc.example.net/Erin"
})
我正在使用spring-data-mongodb並且我正在尋找的是具有如下定義的People類:
@Document
public class People {
private String name;
@Reference // or any Annotation to convert an ObjectId to a String
private String placesId;
private String url;
}
如何將“places_id”作為 mongoDB 中的 ObjectId 但映射到我們的 POJO 中的字符串?
我期待有一個像@Reference這樣的注釋,但它似乎沒有實現。
我不明白為什么我們在 spring-data-mongodb 中沒有這種注釋。 我不想為所有使用手動引用的文檔實現像spring 文檔中建議的顯式轉換器。 也許這不是正確的方法。
我錯過了什么嗎?
更新:
我喜歡讓 POJO 只使用 String 而不是 ObjectId 的想法。 假設我有一個這樣的類Place :
@Document
public class Place {
@Id
private String id;
private String name;
}
place.getId()
將是一個字符串,而people.getPlaceId()
將是一個 ObjectId。 我想避免這種不必要的映射。
如果要真正引用數據庫中的其他對象,請使用Spring Data
提供的@DBRef
注釋。
您更新后的代碼可能如下所示:
@Document
public class People {
private String name;
@DBRef
private Place place;
private String url;
}
然后 Spring Data 會自動Place
對象映射到People
對象。 在內部,這是通過引用唯一的ObjectId
。 試試這個代碼,看看你的 mongo 數據庫。
有關更多信息,請查看: 帶有 java 外鍵的 MongoDb
為什么不將該字段保留為 ObjectId?
@Document
public class People {
private String name;
private ObjectId placesId;
private String url;
}
如果要按此字段查詢,可以執行以下操作:
對於列表
List<String> ids // the ids as strings List<ObjectId> objIds = ids .stream() .map(i -> new ObjectId(i)) .collect(Collectors.toList());
對於單個字符串
String id // single id ObjectId objId = new ObjectId(id);
解決方案是:
import org.springframework.data.mongodb.core.mapping.Field;
import org.springframework.data.mongodb.core.mapping.FieldType;
public class People {
@Field(targetType = FieldType.OBJECT_ID)
private String placesId;
}
這會將 POJO 字符串映射到 MongoDB 中的 ObjectId。
我有一個非常簡單的解決方案:
@JsonSerialize(using= ToStringSerializer.class)
private ObjectId brandId;
...
把它放在對象 ID 的屬性上,對象 ID 像字符串一樣獲取和插入
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.