Как выполнить сложный собственный запрос MongoDB из Java Springboot - PullRequest
0 голосов
/ 19 июня 2020

У меня есть немного сложный запрос создания представления с использованием 3 коллекций. Запрос написан на собственном уровне. Мне нужно, чтобы этот запрос выполнялся из Java, и есть ли способ выполнить эти типы запросов с уровня Java. Может быть, функция, которая принимает собственный запрос MongoDB в виде строки и выполняет его на уровне базы данных

db.createView('TARGET_COLLECTION', 'SOURCE_COLLECTION_1', [
  {
    $facet: {
      SOURCE_COLLECTION_1: [
        {$match: {}},
        { $project: { "sourceId":  {$toString: "$_id"}, "name": 1, "image": "$logo" }}
      ],
      SOURCE_COLLECTION_2: [
        {$limit: 1},
        {
          $lookup: {
            from: 'SOURCE_COLLECTION_2',
            localField: '__unexistingfield',
            foreignField: '__unexistingfield',
            as: '__col2'
          }
        },
        {$unwind: '$__col2'},
        {$replaceRoot: {newRoot: '$__col2'}},
        { $project: { "sourceId": {$toString: "$_id"}, "name": 1, "image": 1 }}
      ],
      SOURCE_COLLECTION_3: [
        {$limit: 1},
        {
          $lookup: {
            from: 'SOURCE_COLLECTION_3',
            localField: '__unexistingfield',
            foreignField: '__unexistingfield',
            as: '__col2'
          }
        },
        {$unwind: '$__col2'},
        {$replaceRoot: {newRoot: '$__col2'}},
        { $project: { "sourceId":  {$toString: "$_id"}, "name": 1, "image": "$logo" }}
      ]
    },
  },
  {$project: {data: {$concatArrays: ['$SOURCE_COLLECTION_1', '$SOURCE_COLLECTION_2', '$SOURCE_COLLECTION_3']}}},
  {$unwind: '$data'},
  {$replaceRoot: {newRoot: '$data'}}
])

1 Ответ

0 голосов
/ 19 июня 2020

Пример:

Рассмотрим документ в коллекции:

{ _id: 1234, name: "J. Doe", colors: [ "red", "black" ] }

И следующее агрегирование из оболочки mongo:

db.collection.agregate( [
  { $project: { _id: 0, colors: 1 } }
] )

Это возвращает : { "colors" : [ "red", "black" ] }

Это также можно запустить с помощью следующей команды:

db.runCommand( { 
  aggregate: "collection", 
  pipeline: [ { $project: { _id: 0, colors: 1 } } ],  
  cursor: { } 
} )

И его перевод с использованием Spring Data MongoTemplate:

String jsonCommand = "{ aggregate: 'collection', pipeline: [ { $project: { _id: 0, colors: 1 } } ], cursor: { } }";
Document resultDoc = mongoTemplate.executeCommand(jsonCommand);

выходной документ resultDoc имеет следующий формат:

{
        "cursor" : {
                "firstBatch" : [
                        {
                                "colors" : [
                                        "red",
                                        "black"
                                ]
                        }
                ],
                "id" : NumberLong(0),
                "ns" : "test.colors"
        },
        "ok" : 1
}

Чтобы узнать больше о методе db.runCommand(...), см. документацию MongoDB по адресу: Команды базы данных и Агрегат команд базы данных .

...