Агрегация MongoTemplate не возвращает результатов после операции - PullRequest
0 голосов
/ 17 мая 2019

Я пытаюсь получить некоторые необработанные данные из коллекции монго. У меня есть две одинаковые коллекции с одинаковыми данными. Когда я пытаюсь получить результаты агрегации с помощью списка 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);

// монго-документ после агрегирования одинаков для обеих коллекций

{
    "_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);

// запрос к монго имеет форму, подобную приведенной ниже

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 пусто.

1 Ответ

0 голосов
/ 17 мая 2019

Это была моя глупая ошибка из-за невнимательности. У моего объекта Criteria было условие с обязательным полем "direction", но во второй коллекции это поле имеет имя "currentDirection". Поэтому агрегация не дала никаких результатов.

...