0

我正在使用Jongowith Play framework 2,java。我在我的MongoDB.

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

但是,当我ObjectId从数据库中获取数据时,它给了我这样的信息:

de.undercouch.bson4jackson.types.ObjectId@484431ff而不是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;
    }
}

编辑

为了获取数据,我只需使用以下find()提供的函数Jongo

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

2 回答 2

1

使用@JsonProperty("_id") 注释的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 的字符串表示将被设置到 Product 实例中

于 2014-06-06T08:25:44.383 回答
1

您的 ObjectId 的类型为 de.undercouch.bson4jackson.types.ObjectId。通过查看源代码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 个整数。它具有 public和方法getTime,因此您可以使用这些值创建自己的方法。这样的事情可能会让你得到你想要的:getMachinegetInc

(id.getTime() + id.getMachine() + ide.GetInc()).toHexString()
于 2014-06-05T09:22:50.933 回答