MongoTemplate匹配聚合中引用的对象



使用MongoTemplateCriteria将文档与相关用户进行匹配,如下所示:

var query = new Query().with(pageable);
query.addCriteria(Criteria.where("user").is(user));
query.addCriteria(Criteria.where("date").gte(startDate).lt(endDate));
mongoTemplate.find(query, MyClass.class);

导致Spring生成正确的查询:

{
"user": {
"$oid": "621bd3461be5bb603f139353"
},
"date": {
"$gte": {
"$date": "2021-10-20T00:00:00Z"
},
"$lt": {
"$date": "2021-10-21T00:00:00Z"
}
}
}

但是,当使用聚合框架使用相同的Criteria时,在$match操作中,如中所示

var filterMatch = Aggregation.match(
new Criteria()
.andOperator(
Criteria.where("user").is(user),
Criteria.where("date").gte(startDate).lt(endDate)
)
);

日志显示整个用户文档正在被用来匹配:

{
"$match": {
"$and": [
{
"user": {
"_id": {
"$oid": "621bd3461be5bb603f139353"
},
"login": "xxx",
"password": "$2a$10$hqx1bowiYiqP",
"email": "xxx",
"activated": true,
"resetKey": "Yt3cXyRvU7QaM58ggQC0",
"createdBy": "anonymousUser",
"createdDate": {
"$date": "2022-02-27T19:38:46.749Z"
},
"lastModifiedBy": "anonymousUser",
"lastModifiedDate": {
"$date": "2022-03-05T13:10:59.761Z"
}
}
},
{
"date": {
"$gte": {
"$date": "2022-02-01T00:00:00Z"
},
"$lt": {
"$date": "2022-02-02T00:00:00Z"
}
}
}
]
}
}

此外,由于某些原因,最新的不起作用,也没有任何回报。

实体中的这种一对多关系是使用@DocumentReference完成的

@DocumentReference
@Indexed
@Field("user")
@JsonIgnore
private User user;

使用Spring Mongo中的聚合框架实现这一点的正确方法是什么?

对于那些在未来发现这个问题的人。。。

使用@DocumentReference只在当前文档中插入外来文档的id,因此执行

var filterMatch = Aggregation.match(
new Criteria()
.andOperator(
Criteria.where("user").is(new ObjectId(userId)),
Criteria.where("date").gte(startDate).lt(endDate)
)
);

解决了我的问题。

相关内容

  • 没有找到相关文章

最新更新