【问题标题】:Morphia error: invalid hexadecimal representation of an ObjectIdMorphia 错误:ObjectId 的十六进制表示无效
【发布时间】:2017-04-25 13:05:42
【问题描述】:

我正在尝试学习 MongoDB 和 Morphia,并且我已经用 Java 创建了一个示例应用程序。 但在执行聚合时,我收到“ObjectId 的十六进制表示无效”错误。

Morphia 版本是 1.3.2

实体:Address.java

@Entity
public class Address {

    @Id
    @Property("id")
    protected ObjectId id;

    private String street;

    private String building;

    private String pin;
}

示例文档:

{
    "_id" : ObjectId("58fcb704c1d24e05ce5851cb"),
    "building" : "SGV",
    "street" : "Galaxy Heights",
    "pin" : "411017"
}

AddressDAO.java:

public class AddressDAO extends BasicDAO<Address, ObjectId>{

    public AddressDAO(Class<Address> entityClass, Datastore ds) {
        super(entityClass, ds);
    } 

    public List<Address> getByGroupedData(String pin) {

        Query<Address> query = createQuery().field("pin").equal(pin);
        Iterator<Address> pipeline = getDatastore().createAggregation(Address.class)
                .match(query)
                .group(Group.id(Group.grouping("building"))).out(Address.class);


        while(pipeline.hasNext()) {
            System.out.println(pipeline.next());
        }

        return null;
    }
}

在 AddressDAO.java 中调用“pipeline.next()”时出现异常:

java.lang.IllegalArgumentException: invalid hexadecimal representation of an ObjectId: [{ "building" : "Galaxy Heights"}]
    at org.bson.types.ObjectId.parseHexString(ObjectId.java:550)
    at org.bson.types.ObjectId.<init>(ObjectId.java:240)
    at org.mongodb.morphia.converters.ObjectIdConverter.decode(ObjectIdConverter.java:32)
    at org.mongodb.morphia.converters.Converters.fromDBObject(Converters.java:124)
    at org.mongodb.morphia.mapping.ValueMapper.fromDBObject(ValueMapper.java:20)
    at org.mongodb.morphia.mapping.Mapper.readMappedField(Mapper.java:844)
    at org.mongodb.morphia.mapping.Mapper.fromDb(Mapper.java:282)
    at org.mongodb.morphia.mapping.Mapper.fromDBObject(Mapper.java:193)

知道我在这里缺少什么吗?

【问题讨论】:

    标签: java mongodb morphia


    【解决方案1】:

    我认为问题出在$out 阶段。它使用 _id 字段作为 building 值创建新集合。

    因此,现在当您尝试将其映射回 Address 对象并将 _id 定义为对象 id 时,会导致错误。

    因此解决方法是使用$projection 来抑制最终响应中的_id 字段,以便$out 阶段创建一个新的对象ID。

    试试这样的。

    Iterator<Address> pipeline = getDatastore().createAggregation(Address.class)
                    .match(query)
                    .group(Group.id(Group.grouping("building")))
                    .project(Projection.projection("_id").suppress(), Projection.projection("building", "$_id"))
                    .out(Address.class);
    

    旁注:您可能应该为新集合映射到新的 pojo 对象。

    【讨论】:

    • 我会尝试你的建议并让你知道。谢谢 Veeram。
    • 赞成。休息几天后我仍在努力
    猜你喜欢
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    相关资源
    最近更新 更多