2014-06-05 64 views
0

我使用JongoPlay framework 2,java。我在我的MongoDB中添加了一些數據。如何從MongoDB獲取ObjectId值?

{"_id" : ObjectId("538dafffbf6b562617252178"), ... } 

然而,當我從數據庫中取出的ObjectId,它給了我這樣的:

[email protected]而不是538dafffbf6b562617252178。我不太明白怎樣才能獲得ObjectId的價值。我的類定義如下:

public class Product { 
    @JsonProperty("_id") 
    protected String id; 
    ... 
    public Product() { 
    } 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 
} 

編輯

爲了獲取數據,我簡單地使用由Jongo提供如下find()功能:

public static Iterable<Product> findAll(){ 
    return products().find().as(Product.class); 
} 
+0

你嘗試用密鑰值,即cursor.get(「_ ID」)獲取它。的valueOf()? – AppleBud

+0

@AppleBud我用'find()'方法來獲取數據。請看我編輯的問題。 – lvarayut

回答

1

id字段只是意味着你的產品文檔具有自定義ID(即由用戶如設置好的:1234,5678, ...)

您應該使用@Id和@ObjectId批註標註id字段,以告知Jongo將id字段作爲由MongoDB管理的真實ObjectId處理。

public class Product { 

@org.jongo.marshall.jackson.oid.Id 
@org.jongo.marshall.jackson.oid.ObjectId 
protected String id; 
... 
    public Product() { 
    } 
} 

在反序列化的ObjectId的字符串表示將內置於產品的情況下

+0

感謝您的回覆。我試過你上面提到的,但是,它給了我'執行異常[[RuntimeException:java.lang.IllegalArgumentException:無效的ObjectId [[email protected]](通過引用鏈:java.util.ArrayList [0] - > models.Product [「_ id」])]]' – lvarayut

+0

您應該打開一個問題https://github.com/bguerout/jongo/issues並提供完整的堆棧跟蹤。這個問題將在稍後以我們發現的內容進行更新。 –

1

你的ObjectId是鍵入de.undercouch.bson4jackson.types.ObjectId。通過查看source,您可以看到該類上沒有定義toString方法,因此將使用默認的toString實現。

MongoDB的ObjectId實際上是一個使用構建12位BSON類型:

a 4-byte value representing the seconds since the Unix epoch, 
a 3-byte machine identifier, 
a 2-byte process id, and 
a 3-byte counter, starting with a random value. 

您的使用是建立在類有點不同 - 它的內部存儲爲3點的整數。它有公開的getTimegetMachinegetInc方法,因此您可以使用這些值創建您自己的方法。像這樣的東西可能會得到你想要的東西:與@JsonProperty(「_ ID」)註釋

(id.getTime() + id.getMachine() + ide.GetInc()).toHexString()