4

我的 MongoDB 中有两种文档:客户端和代码。每个代码都指一个客户。客户端必须由管理员显式存储,因此我必须将它们单独存储并且不能将它们放入代码文档中。

code -> client

现在 MongoDB / Morphia 将客户端的技术 id 保存为 ObjectId,而代码指的是具有 String 类型的技术 id 的客户端。我可以通过给定的客户端 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)));
    }
}
4

2 回答 2

6

不确定这是否已经解决。我有同样的问题。我的解决方案是自己设置 id。

@Id
private String id = new ObjectId().toString();

现在您可以像对待任何其他字符串字段一样对待 id 字段。

希望这可以帮助。

于 2012-05-27T11:05:07.267 回答
1

我的做法略有不同,因此我可以在 REST 请求中使用 id 作为路径参数。

@Id
private String id = new ObjectId().toHexString();
于 2015-10-01T22:53:07.320 回答