我的MongoDB中有两种文档:客户端和代码。每个代码都指一个客户端。客户端必须由管理员明确存储,因此我必须将它们分开存储,不能将它们放入代码文档中。
code -> client
现在MongoDB / Morphia将客户端的技术ID保存为ObjectId,而代码引用技术ID为String类型的客户端。我能够通过给定的客户端ID搜索代码,但在运行时我会收到错误消息,因为Morphia无法注入客户端。我认为这是因为不同的id类型。
code { client.$id: String }
client { _id: ObjectId }
任何想法如何解决这个问题?
异常
com.google.code.morphia.mapping.MappingException:无法为org.example.Code.client获取引用({“$ ref”:“clients”,“$ id”:“123456789abcdef”})
在互联网上,我发现了异常消息。有人建议在模型中使用ObjectId而不是String,但我需要使用String。这不是我自己的项目。
实体:
@Entity("codes")
public class Code implements Comparable<Code> {
@Id
private String id;
@Reference
private Client client;
[...]
}
@Entity("clients")
public class Client {
@Id
private String id;
}
存储
要存储我使用的对象com.google.code.morphia.dao.DAO.save(T entity)
。
搜索:
public class CodeRepository extends BasicDAO<Code, String> {
[... constructor ...]
@Override
public Code findByCode(String type, String clientId, String code) {
return findOne(createQuery()
.field("type")
.equal(type)
.field("value")
.equal(code)
.field("client")
.equal(new Key<Client>(Client.class, clientId)));
}
}
答案 0 :(得分:6)
不确定这是否已解决。我有同样的问题。我的解决方案是自己设置id。
@Id
private String id = new ObjectId().toString();
现在您可以将id字段视为任何其他字符串字段。
希望这会有所帮助。
答案 1 :(得分:1)
我做的略有不同,所以我可以在REST请求中使用id作为路径参数。
@Id
private String id = new ObjectId().toHexString();