通过Id查询Morphia

5
我正在使用 MongoDB 的 Pojo 映射器 Morphia,发现一个本该非常简单的任务却比较困难:根据 ID 获取对象。我能够在集合中找到所有对象,但无法通过已获取的 ID 简单查询。实际上,我是指 ObjectId。如果我尝试将其渲染为 JSON,则会看到...
4个回答

13

这个问题似乎不完整。

而且看起来你问题的答案在Morphia QuickStart页面上。答案似乎很简单,只需按照以下步骤操作即可。

Datastore ds = morphia.createDatastore("testDB");
String hotelId = ...; // the ID of the hotel we want to load
// and then map it to our Hotel object
Hotel hotel = ds.get(Hotel.class, hotelId);

所以你肯定需要更多的细节。


5
永远不要忘记在实体类中添加“@Id ObjectId id”。这将使您的生活更加轻松。 - caarlos0
我想他和我一样需要查询。例如,如果我们想使用createIfMissing,updateFirst就需要一个查询。因此,我们可以构建一个查询或者只使用我们已有的键来构建一个查询。但是,如果你不想指定id的名称,只想指定值。你需要一个操作,仅使用id值即可给出查询。 - Gonzalo Aguilar Delgado
不幸的是,这种技术在较新版本的Morphia中已被弃用。它仍将起作用,至少直到从DataStore中删除get方法。推荐的方法是使用Query类按id获取内容。 // 假设有ObjectId id; Query<Hotel> query = datastore.createQuery(Hotel.class); query.criteria("_id").equal(id); return query.first(); - Steve Owens
谢谢@SteveOwens,我刚刚意识到这篇文章是9年前写的。在这篇文章之后不久,我实际上开始与Morphia的原始创建者Scott Hernandez合作。但是自那时以来,它已经经历了另外两个主要贡献者。我们俩都不再使用Mongo了。https://github.com/MorphiaOrg/morphia/graphs/contributors所以我真的不知道该怎么办。您是否有“新方法”的官方文档?我们应该只用Morphia版本号标记此问题吗? - Gates VP
从我的角度来看,这并不重要。我已经转向使用spring-data-mongo,并且对API感到更加满意。 - Steve Owens

8
Datastore ds = morphia.createDatastore("testDB");
String hotelId = "516d41150364a6a6697136c0"; // the ID of the hotel we want to load
ObjectId objectId = new ObjectId(hotelId);
// and then map it to our Hotel object
Hotel hotel = ds.get(Hotel.class, objectId);

你能解释一下为什么你的代码可以运行或者它在做什么吗?最好的回答是解释解决方案,而不仅仅是提供可运行的代码。 - nathangiesbrecht
@nathangiesbrecht 在之前的回答是不正确的。MongoDB Id 不是字符串类型。MongoDB Id 的类型是 ObjectId (org.bson.types.ObjectId)。 - Pavel B

7
如果您正在按id查找,而id由用户提供(这意味着它可以是任何类型的数据),则不应使用上述给出的解决方案。
根据文档的解释,ObjectId由12个字节组成,因此如果将其他内容传递给new ObjectId(myValue),您的代码将抛出IllegalArgumentException
以下是如何实现按id查找方法的示例:
public Model findById(String id) throws NotFoundException {
    if (!ObjectId.isValid(id)) {
        throw new NotFoundException();
    }

    ObjectId oid = new ObjectId(id);
    Model m = datastore().find(Model.class).field("_id").equal(oid).get();
    if (m == null) {
        throw new NotFoundException();
    }
    return m;
}

在 Morphia 2.x 中,此功能已被弃用。 - mobiusinversion

0

之前的解释使用了已弃用的方法:datastore().find(Model.class).field("_id").equal(oid).get(); 我在 Morphia 2.2.10 上的变体:

public Optional<Hotel> findById(final String id) {
    if (!ObjectId.isValid(id)) {
        throw new SomeException();
    }

    final Query<Hotel> query = datastore.find(Hotel.class)
        .filter(eq("_id", new ObjectId(id)));
    return Optional.ofNullable(query.first());
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接