java - MongoTemplate聚合操作后没有返回结果

标签 java spring mongodb aggregation-framework projection

我正在尝试从 mongo 集合中获取一些原始数据。我有两个具有相同数据的相似集合。当我尝试使用 DBObject 列表获取聚合结果时,第一个集合数据完全返回,但第二个集合数据不返回任何内容。但我需要从第二个集合返回数据。

根据我的观察,第一个集合包含带有“_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 为空。

最佳答案

这是我由于疏忽而犯的愚蠢错误。我的对象 Criteria 有一个带有必填字段“direction”的条件,但在第二个集合中该字段的名称为“currentDirection”。因此聚合没有给出任何结果。

关于java - MongoTemplate聚合操作后没有返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56188040/

相关文章:

mongodb - 只从 mongodb 返回数组中的命中

python - mongodb python 中的身份验证

java - 无法识别的选项 : - Could not create the Java virtual machine

java - 如何从 spring 3.x 调用 web 服务或 url

node.js - 无法从 mongojs 连接,但命令行正常

java - 当我的 session 创建策略设置为 STATELESS 时,为什么 Spring Security 的 SessionManagementFilter 仍在运行?

java - 使用java在mysql中保存和获取阿拉伯语

java - 在非 Maven 项目中使用 Maven Artifact

java - Stomp 的 MessageMap 格式是不是完全不能用了?

java - 如何在时间序列jfree图表上添加文本/图像