0

我一直在使用 MongoInputFormat,它允许将 MongoDB 集合中的所有文档放入用 Hadoop 编写的 MapReduce 作业。

正如您在提供的示例(thisthisthis)中看到的那样,提供给映射器的文档类型是BSONObject(Java 中的接口)。

现在我也非常喜欢Morphia,它允许将原始数据从 MongoDB 映射到更易于使用的 POJO。

因为我只能得到一个 BSONObject 作为输入,所以我考虑过使用Morphia wiki页面底部描述的方法:

BlogEntry blogEntry = morphia.fromDBObject(BlogEntry.class, blogEntryDbObj);

我的问题是这种方法需要一个DBObject而不是BSONObject。DBObject 实际上是:

public interface DBObject extends BSONObject

如您所见,我不能简单地从 BSONObject 转换为 DBObject 并调用提供的方法。

我如何以最好的方式处理这个问题?

4

2 回答 2

1

您会注意到BSONObjectDBObject接口非常相似。仅仅因为一个 converson 不存在并不意味着创建一个微不足道的 converson 并不容易:

class BSONDBObject extends BasicBSONObject implements DBObject {
    boolean ispartial = false;
    public BSONDBObject(BSONObject source) {
        this.putAll(source);
    }
    public boolean isPartialObject() {
        return ispartial;
    }
    public void markAsPartialObject() {
        this.ispartial = true;
    }
}

现在,你只需要

BSONObject bson; // Filled by the MongoInputFormat
BSONBDObject dbo = BSONDBObject(bson);
EntityCache = entityCache = new DefaultEntityCache();
BlogEntry blogEntry = morphia().fromDBObject(BlogEntry.class, dbo, entityCache);
于 2013-12-09T01:00:11.000 回答
-1

我找到了一个适合我的解决方案:

  • 先做成一个JSON文本字符串
  • 将其解析为 DBObject
  • 使用 Morphia 将其映射到一个有用的实例。

实际上,我现在有这样的东西:

BSONObject bson; // Filled by the MongoInputFormat

EntityCache = entityCache = new DefaultEntityCache();
String json = JSON.serialize(bson)    
DBObject dbObject = (DBObject) JSON.parse(json);
BlogEntry blogEntry = morphia().fromDBObject(BlogEntry.class, dbObject, entityCache);
于 2012-09-28T15:47:46.670 回答