-->

MongoDB的/吗啡节约技术的id的ObjectId尽管它在Java中的String(MongoD

2019-09-17 00:49发布

我有两个类型的文件在我的MongoDB:客户和代码。 每个代码是指一个客户端。 客户端都必须由管理员明确地存储,因此我必须存放分开,不能把它们放入一个代码文件。

code -> client

现在的MongoDB /吗啡节省客户的的ObjectId技术IDS,而代码是指客户类型为String的技术ID。 我可以通过给定的客户端ID来搜索代码,但在运行时我会得到一个错误信息,因为吗啡不能注入客户端。 我想这是因为不同的ID类型。

code { client.$id: String }
client { _id: ObjectId }

任何想法如何解决这一问题?

例外

com.google.code.morphia.mapping.MappingException:参考({ “$ REF”: “客户端”, “$标识”: “123456789abcdef”})无法抓取的org.example.Code.client

在互联网上,我发现异常消息。 有人建议使用的ObjectId,而不是字符串的模式,但我必须使用字符串的要求。 这不是我自己的项目。

实体:

@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)));
    }
}

Answer 1:

如果这还解决了不确定。 我有同样的问题。 对我来说,解决办法是设置id自己。

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

现在你可以把ID字段像任何其他字符串字段。

希望这可以帮助。



Answer 2:

我做到了略有不同,所以我可以使用id作为路径PARAM在REST请求。

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


文章来源: MongoDB / Morphia saves technical id as ObjectId although it's a String in Java