MongoDb spring数据查询二进制和UUID

Var*_*ave 6 java mongodb spring-data-mongodb

我正在尝试使用 Spring Data - Mongo 模板基于 UUID 进行查询。生成的查询不会返回预期的文档。当我尝试使用 new BinData(type, base64) 在 shell 中运行查询时,它会返回文档。生成的查询 a 使用 {"$binary" : "base64", "$type" : "03} 作为匹配过滤器。

我有一个 id 配置为 UUID 类型的对象。这是对象类型。

@Data
@NoArgsConstructor
@Document(collection = "person")
public class Person {
   @Id
   private UUID id;

   private String firstName;

   private String lastName;
   ...
}
Run Code Online (Sandbox Code Playgroud)

下面是自定义存储库的实现方法。

...
Query findPersonQuery = new Query();

        findPersonQuery.addCriteria(Criteria.where("_id").is(personId));

        final Person person = mongoTemplate.find(findPersonQuery, Person.class);
// process and return person after
....

Run Code Online (Sandbox Code Playgroud)

当我传入 UUID 时,上面的代码似乎会生成一个解析的查询。UUID 为 a02b2900-b871-11e9-a2a3-2a2ae2dbcce4

{ "_id" : { "$eq" : { "$binary" : "6RFxuAApK6DkzNviKiqjog==", "$type" : "03" } } }
Run Code Online (Sandbox Code Playgroud)

当我在 mongo shell 中运行它时,它什么也没有返回。在存储库中它什么也不返回。

但是,当我在 mongo shell 中输入以下查询时,我得到了正确的 person 对象

db.getCollection('person').find({  "_id" : new BinData(3, "6RFxuAApK6DkzNviKiqjog==")})
Run Code Online (Sandbox Code Playgroud)

我期望生成的查询返回 UUID 为 a02b2900-b871-11e9-a2a3-2a2ae2dbcce4 的人

问题:

  1. 传递到 shell 时 $binary 运算符和 BinData 之间有什么区别。
  2. 如何获取 spring 数据和 mongoTemplate 来生成正确的查询。2.1 不写自定义查询是否可以?

我知道我们可以做类似 BasicQuery 的事情,如下所示,但有没有办法避免它,因为我们现在必须提供 Base 64 的自定义编码器,而不是允许 JPA 样式将 UUID 转换为持久层

final ByteBuffer buffer = ByteBuffer.wrap(new byte[16]);
        buffer.putLong(personId.getMostSignificantBits());
        buffer.putLong(personId.getLeastSignificantBits());
        final String base64PersonId = Base64.encodeBase64String(buffer.array());
  final String query = String.format("{ _id: new BinData(3,\"%s\")}", JSONObject.escape(username), base64PersonId);

        return new BasicQuery(query);
Run Code Online (Sandbox Code Playgroud)