使用MongoTemplate
和Criteria
将文档与相关用户进行匹配,如下所示:
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)
)
);
解决了我的问题。