簡體   English   中英

使用 Spring-data mongodb 在 Java 中使用 ObjectId 作為字符串(手冊參考)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM