Конвейер агрегации mongoDB в mongoTemplate.executeCommand (Java - SpringBoot) - PullRequest
0 голосов
/ 13 ноября 2018

Я хотел бы использовать этот работающий конвейер агрегации с mongoTemplate.executeCommand, который принимает в качестве аргумента команду String json или команду документа, но я не могу найти этот чертов синтаксис.

трубопровод:

> db.getCollection('collectionName').aggregate([
{   
   $lookup: {  
       from: "SecondCollectionName",   
       localField: "field",    
       foreignField: "toMatch",    
       as: "arrayForeignObject"   
           }
},  
{ $unwind: { path: "$arrayForeignObject", preserveNullAndEmptyArrays: true}},    
{
    $replaceRoot: { newRoot: { $mergeObjects: [ "$arrayForeignObject", "$$ROOT" ] } }
},   
{ $project: { "arrayForeignObject": 0, "_id": 0, "IDDIRECTORYITEM":0 } },   
{ $out: "collectionName" }
])

Это работает на rob3t для примера.

используя это в Java:

AggregationOperation lookup = Aggregation.lookup(fromCollection, localField, toMatchWith, arrayForeignObject);
AggregationOperation project = Aggregation.project().andExclude(arrayForeignObject, "_id", argsString);
AggregationOperation unwind = Aggregation.unwind(arrayForeignObject, true);
AggregationOperation replaceRoot = Aggregation.replaceRoot().withValueOf(ObjectOperators.valueOf(arrayForeignObject).mergeWith(Aggregation.ROOT));
AggregationOperation out = Aggregation.out(finalCollection);
Aggregation aggregation = Aggregation.newAggregation(lookup, unwind, replaceRoot, project, out);

mongoTemplate.aggregate(aggregation, initialCollection, model);

Это отлично работает, но я делаю агрегацию на более чем 2 млн строк. На агрегации выполнения работает, но Java пытается отправить его сборщик мусора на ??? Я не знаю, может быть, он моделирует различные объекты (я бы предпочел, чтобы он этого не делал, но мне не нужно выбирать). В результате ошибка GC. Я оцениваю другие сообщения, которые являются нормальными с такими большими данными. Я инкриминирую 'model.Class' в mongoTemplate.aggregate (агрегация, initialCollection, model); быть ответственным за эту ошибку GC.

Так что я ищу способ отправить конвейер агрегации напрямую в MongoDB, чтобы выполнить его напрямую, без прохождения через Java.

Я задаю новый вопрос, потому что я пробую много решений, предложенных другими, но ни одно из них не работает, и когда я пытался спросить в том же посте, меня оттолкнули и удалили. пример: агрегация mongotemplate с уникальными результатами попробовал это, но для аргументов, переданных в .aggregate (), DBObject являются недопустимыми аргументами.

Может кто-нибудь помочь мне, пожалуйста? Приветствия

РЕДАКТИРОВАТЬ:

 String query = "{$lookup: {" +    
                "       from: \"collection2\"," +     
                "       localField: \"VISIBLEONLINE\"," +     
                "       foreignField: \"IDDIRECTORYITEM\"," +     
                "       as: \"arrayForeignObject\" }}," +     
                "{ $unwind: { path: \"$arrayForeignObject\", preserveNullAndEmptyArrays: true}}," +     
                "{ $replaceRoot: { newRoot: { $mergeObjects: [ \"$arrayForeignObject\", \"$$ROOT\" ] } }}," +      
                "{ $project: { \"arrayForeignObject\": 0, \"_id\": 0, \"IDDIRECTORYITEM\":0 } }," +      
                "{ $out: \"collection\" }";      

Вот звонок:

  mongoTemplate.executeCommand("{aggregate: 'collection', pipeline: "+query+"}");
...