MongoTemplate聚合returns运行后无结果
MongoTemplate aggregation returns no results after operation
我正在尝试从 mongo 集合中获取一些原始数据。我有两个具有相同数据的相似集合。当我尝试使用 DBObject 列表获取聚合结果时,第一个集合的数据 return 已完全编辑,但第二个集合的数据 return 没有。但是我需要 return 来自第二个集合的数据。
根据我的观察,第一个集合包含字段为“_class”的文档,而另一个没有。在投影数据类似的管道末端。我打断了。
//第一个集合的文档
{
"_id" : ObjectId("5cdd7a0848d4ce0001239b62"),
"_class" : "com.my.proj.entity.MovementEvent",
"zoneId" : ObjectId("54e70a7b2cdcc65ef6d80eff"),
"direction" : "OUT",
"transportId" : "AAAA",
"eventDate" : ISODate("2019-05-16T14:56:07Z"),
"lastUpdated" : ISODate("2019-05-16T14:56:08.571Z")
}
//第二个集合中的文档
{
"_id" : ObjectId("5955daa8d87a127b75154c7d"),
"zoneId" : ObjectId("54e70a7b2cdcc65ef6d80eff"),
"transportId" : "AAAA",
"currentDirection" : "OUT",
"eventDate" : ISODate("2019-05-16T14:56:07Z"),
"serviceFlag" : false,
"lastUpdated" : ISODate("2019-05-16T14:56:08.570Z")
}
//投影对象:
ProjectionOperation projectionStage = Aggregation.project()
.and(PROJECTION_ELEMENT + "._" + MovementEvent.ID_FIELD).as("_" + MovementEvent.ID_FIELD)
.and(PROJECTION_ELEMENT + "." + MovementEvent.DIRECTION).as(MovementEvent.DIRECTION)
.and(PROJECTION_ELEMENT + "." + MovementEvent.EVENT_DATE).as(MovementEvent.EVENT_DATE)
.and(PROJECTION_ELEMENT + "." + MovementEvent.LAST_UPDATED_FIELD).as(MovementEvent.LAST_UPDATED_FIELD)
.and(PROJECTION_ELEMENT + "." + MovementEvent.TRANSPORT_ID).as(MovementEvent.TRANSPORT_ID)
.and(PROJECTION_ELEMENT + "." + MovementEvent.ZONE_ID).as(MovementEvent.ZONE_ID);
// mongo 两个集合聚合后的文档相同
{
"_id" : ObjectId("5955daa8d87a127b75154c7d"),
"zoneId" : ObjectId("54e70a7b2cdcc65ef6d80eff"),
"transportId" : "AAAA",
"currentDirection" : "OUT",
"eventDate" : ISODate("2019-05-16T14:56:07Z"),
"lastUpdated" : ISODate("2019-05-16T14:56:08.570Z")
}
//聚合管道
AggregationResults<DBObject> result1 = mongoTemplate.aggregate(
Aggregation.newAggregation(matchStage, sortStage, groupStage,projectionStage), "lastMovementFlag",DBObject.class);
// 对 mongo 的请求具有如下形式
db.lastMovementFlag.aggregate([
{$match:{$and:[{transportId:"AAAA"},{$or:[{"zoneId":ObjectId("54e70a7b2cdcc65ef6d80eff")},{zoneId:ObjectId("54e70b232cdcc65ef6d80f00")}]}]}},
{$sort:{eventDate:1}},
{$group:{_id:{transportId:"$transportId"}, last:{$last:"$$ROOT"}}},
{$project:{_id:"$last._id", _class:"$last._class",direction:"$last.currentDirection",eventDate:"$last.eventDate",lastUpdated:"$last.lastUpdated",transportId:"$last.transportId", zoneId:"$last.zoneId"}}
])
我可以从 "Movements" 集合中检索数据,但不能从 "lastMovementFlag" 中检索数据。 AggregationResults 为空。
这是我由于注意力不集中而犯下的愚蠢错误。我的对象条件具有必填字段 "direction" 的条件,但在第二个集合中该字段的名称为 "currentDirection"。因此聚合没有给出任何结果。
我正在尝试从 mongo 集合中获取一些原始数据。我有两个具有相同数据的相似集合。当我尝试使用 DBObject 列表获取聚合结果时,第一个集合的数据 return 已完全编辑,但第二个集合的数据 return 没有。但是我需要 return 来自第二个集合的数据。
根据我的观察,第一个集合包含字段为“_class”的文档,而另一个没有。在投影数据类似的管道末端。我打断了。
//第一个集合的文档
{
"_id" : ObjectId("5cdd7a0848d4ce0001239b62"),
"_class" : "com.my.proj.entity.MovementEvent",
"zoneId" : ObjectId("54e70a7b2cdcc65ef6d80eff"),
"direction" : "OUT",
"transportId" : "AAAA",
"eventDate" : ISODate("2019-05-16T14:56:07Z"),
"lastUpdated" : ISODate("2019-05-16T14:56:08.571Z")
}
//第二个集合中的文档
{
"_id" : ObjectId("5955daa8d87a127b75154c7d"),
"zoneId" : ObjectId("54e70a7b2cdcc65ef6d80eff"),
"transportId" : "AAAA",
"currentDirection" : "OUT",
"eventDate" : ISODate("2019-05-16T14:56:07Z"),
"serviceFlag" : false,
"lastUpdated" : ISODate("2019-05-16T14:56:08.570Z")
}
//投影对象:
ProjectionOperation projectionStage = Aggregation.project()
.and(PROJECTION_ELEMENT + "._" + MovementEvent.ID_FIELD).as("_" + MovementEvent.ID_FIELD)
.and(PROJECTION_ELEMENT + "." + MovementEvent.DIRECTION).as(MovementEvent.DIRECTION)
.and(PROJECTION_ELEMENT + "." + MovementEvent.EVENT_DATE).as(MovementEvent.EVENT_DATE)
.and(PROJECTION_ELEMENT + "." + MovementEvent.LAST_UPDATED_FIELD).as(MovementEvent.LAST_UPDATED_FIELD)
.and(PROJECTION_ELEMENT + "." + MovementEvent.TRANSPORT_ID).as(MovementEvent.TRANSPORT_ID)
.and(PROJECTION_ELEMENT + "." + MovementEvent.ZONE_ID).as(MovementEvent.ZONE_ID);
// mongo 两个集合聚合后的文档相同
{
"_id" : ObjectId("5955daa8d87a127b75154c7d"),
"zoneId" : ObjectId("54e70a7b2cdcc65ef6d80eff"),
"transportId" : "AAAA",
"currentDirection" : "OUT",
"eventDate" : ISODate("2019-05-16T14:56:07Z"),
"lastUpdated" : ISODate("2019-05-16T14:56:08.570Z")
}
//聚合管道
AggregationResults<DBObject> result1 = mongoTemplate.aggregate(
Aggregation.newAggregation(matchStage, sortStage, groupStage,projectionStage), "lastMovementFlag",DBObject.class);
// 对 mongo 的请求具有如下形式
db.lastMovementFlag.aggregate([
{$match:{$and:[{transportId:"AAAA"},{$or:[{"zoneId":ObjectId("54e70a7b2cdcc65ef6d80eff")},{zoneId:ObjectId("54e70b232cdcc65ef6d80f00")}]}]}},
{$sort:{eventDate:1}},
{$group:{_id:{transportId:"$transportId"}, last:{$last:"$$ROOT"}}},
{$project:{_id:"$last._id", _class:"$last._class",direction:"$last.currentDirection",eventDate:"$last.eventDate",lastUpdated:"$last.lastUpdated",transportId:"$last.transportId", zoneId:"$last.zoneId"}}
])
我可以从 "Movements" 集合中检索数据,但不能从 "lastMovementFlag" 中检索数据。 AggregationResults 为空。
这是我由于注意力不集中而犯下的愚蠢错误。我的对象条件具有必填字段 "direction" 的条件,但在第二个集合中该字段的名称为 "currentDirection"。因此聚合没有给出任何结果。