【发布时间】:2020-10-15 01:15:49
【问题描述】:
我的聚合有一个奇怪的行为。我有很多这样的文件:
{
"_id" : "xxxxxxx",
"someId" : "xxxxxxx",
"creationDatetime" : ISODate("2019-07-11T15:10:35.747Z"),
"versions" : [
{
"versionDatetime" : ISODate("2019-07-11T15:10:35.785Z"),
"startDatetime" : ISODate("2019-03-29T09:07:04.000Z"),
"endDatetime" : ISODate("2019-08-05T11:07:04.000Z"),
"name" : "ThisIsAName"
},
{
"versionDatetime" : ISODate("2019-07-11T15:20:35.785Z"),
"startDatetime" : ISODate("2019-03-29T09:07:04.000Z"),
"endDatetime" : ISODate("2019-08-05T11:07:04.000Z"),
"name" : "ThisIsAName"
}
],
"_class" : "com.xx.xx.xx.MyDocument"
}
当有新版本时,我尝试通过“someId”和“versions.name”聚合每个文档。
private List<> function(List<String> someIds) {
Instant now = Instant.now();
MatchOperation matchOperation = Aggregation.match(new Criteria(MyDocument.version.dateTime)
.gte(now.minus(1, ChronoUnit.MINUTES).truncatedTo(ChronoUnit.MINUTES))
.lt(now.truncatedTo(ChronoUnit.MINUTES))
.and(MyDocument.id).in(someIds));
SortOperation sortByUpdateDatetime = sort(Sort.Direction.DESC, MyDocument.version.dateTime);
GroupOperation groupByService = group(MyDocument.someId, MyDocument.version.name)
.count().as(count)
.first(MyDocument.someId).as(someId)
.first(MyDocument.version.name).as(name)
.first(MyDocument.version.dateTime).as(lastUpdate);
Aggregation aggregation = newAggregation(matchOperation, sortByUpdateDatetime, groupByService);
AggregationResults<ClientAggregationResult> result = mongoTemplate.aggregate(
aggregation, MyDocument.class, ClientAggregationResult.class);
return result.getMappedResults().stream().map(this::toDataDTO).collect(Collectors.toList());
}
在 mongoShell 中是这样的:
db.getCollection('parkingRight').aggregate([ {
"$match" : {
"versions.datetime" : {
"$gte" : {
"$date" : "2020-06-23T15:00:00.000Z"} ,
"$lt" : { "$date" : "2020-06-24T17:20:00.000Z"}} ,
"someId" : { "$in" : [ "xxx", "yyy", "kkk"]}}} ,
{ "$sort" : { "versions.datetime" : -1}} ,
{ "$group" : {
"_id" : {
"someId" : "$someId" ,
"name" : "$versions.name"} ,
"count" : {"$sum" : 1} ,
"someId" : { "$first" : "$someId"} ,
"name" : { "$first" : "$versions.name"} ,
"lastDate" : { "$first" : "$versions.datetime"}
}
}
])
但是当有多个版本时,聚合的 Doc 会像这样连接字段名称:name: ThisIsAName,ThisIsAName。每个版本的文档都有一个 ThisIsAName。
其他字段正常。
你知道这是我的言辞错误还是奇怪的行为?
【问题讨论】:
-
你可以添加一个文档和mongo查询而不是java代码。
-
为了更清晰,我添加了 mongoShell 查询
标签: java mongodb spring-data-mongodb aggregation