【问题标题】:How to get the ObjectId value from MongoDB?如何从 MongoDB 获取 ObjectId 值?
【发布时间】:2014-06-05 08:50:37
【问题描述】:

我正在使用JongoPlay 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;
    }
}

编辑

为了获取数据,我简单地使用Jongo提供的find()函数如下:

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

【问题讨论】:

  • 您是否尝试使用键值即 cursor.get("_id").valueOf() 获取它?
  • @AppleBud 我使用find() 方法来获取数据。请查看我编辑的问题。

标签: java mongodb playframework-2.0 jackson jongo


【解决方案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 实例中

【讨论】:

  • 感谢您的回复。我试过你上面提到的,但是,它给了我Execution exception[[RuntimeException: java.lang.IllegalArgumentException: invalid ObjectId [de.undercouch.bson4jackson.types.ObjectId@6e07e6fc] (through reference chain: java.util.ArrayList[0]-&gt;models.Product["_id"])]]
  • 您应该打开一个问题github.com/bguerout/jongo/issues 并提供完整的堆栈跟踪。这个问题稍后将根据我们的发现进行更新。
【解决方案2】:

您的 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 方法,因此您可以使用这些值创建自己的方法。这样的事情可能会让你得到你想要的:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    相关资源
    最近更新 更多