gpt4 book ai didi

java - 莫菲亚错误: invalid hexadecimal representation of an ObjectId

转载 作者:行者123 更新时间:2023-11-30 02:33:55 26 4
gpt4 key购买 nike

我正在尝试学习 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)

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

最佳答案

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

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

因此,解决方法是使用 $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 对象。

关于java - 莫菲亚错误: invalid hexadecimal representation of an ObjectId,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43611549/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com