Преобразовать Mongo $ push с несколькими полями в запрос драйвера Java Mongo - PullRequest
0 голосов
/ 12 октября 2018

Мне трудно создать Java-эквивалент $ push-части следующей группы mongo $:

db.crewtrades.aggregate(
{
    $group: 
    {
        _id: {staffId: '$initiatingStaffId', status: '$status', firstName: '$initiatingStaffFirstName'}, 
    count:{'$sum':1}
    }
},
{
    $group:
    {
        _id:'$_id.staffId',
        name: {$first: '$_id.firstName'},
        statuses:
        {
            $push:
            {
                status:'$_id.status',
                count:'$count'
            }
        }, 
        staffCount: {$sum: '$count'}
    }
}

)

Результат должен выглядеть примерно так:

{
"_id" : "00238061",
"name" : "Kirstie Rachel Wong",
"statuses" : [ 
    {
        "status" : "Pending",
        "count" : 1.0
    }, 
    {
        "status" : "Approved",
        "count" : 2.0
    }
],
"staffCount" : 3.0

}

Я пробовал следующее:

private List<Bson> createPipeline(String companyCode, String startDate, String endDate, String eventType, List<String> eventConfigIds, String requestType, String staffId, String status) {
    return Arrays.asList(
            match(and(getBsons(companyCode, startDate, endDate, eventConfigIds, requestType, staffId, status)
            )),
            (group("_id", createIdFields(startDate, endDate, eventType))),
            (group("$staffId",
                    first("firstName", "$firstName"),
                    first("lastName", "$lastName"),
                    first("startDate", "$startDate"),
                    first("endDate", "$endDate"),
                    first("eventType", "$eventType"),
                    first("requestType", "$requestType"),
                    push("statuses", createPushFields()),
                    sum("staffCount", "$count")
            )));
}

private DBObject createPushFields() {
    return new BasicDBObject("status","$status").append("count","$count");
}

private List<BsonField> createIdFields(String startDate, String endDate, String eventType) {
    ArrayList<BsonField> fields = new ArrayList<>();
    fields.add(first("staffId", "$initiatingStaffId"));
    fields.add(first("firstName", "$initiatingStaffFirstName"));
    fields.add(first("lastName", "$initiatingStaffLastName"));
    fields.add(push("status", "$status"));
    fields.add(first("startDate", startDate));
    fields.add(first("endDate", endDate));
    fields.add(first("eventType", eventType));
    fields.add(first("requestType", "$tradeBoardId"));
    fields.add(sum("count", 1));
    return fields;
}

Но в итоге возвращается:

[
{
    "_id": "00238061",
    "firstName": "Kirstie Rachel Wong",
    "lastName": "Wong",
    "startDate": "2018-01-01T16:30:40Z",
    "endDate": "2018-12-12T16:30:40Z",
    "eventType": "DutySwap",
    "requestType": 0,
    "statuses": [
        {
            "status": [
                "Approved",
                "Approved",
                "Pending"
            ],
            "count": 3
        }
    ],
    "staffCount": 3
}

]

Как мне указать в коде Java Mongo, что статус («Утверждено», «Ожидание») и число для каждого статуса должны быть объектом JSON в массиве statuses?Собственный запрос Mongo способен справиться с этим, но я не могу заставить драйвер Java делать то же самое.

Цените любую помощь с этим!

...