首页 > 解决方案 > 如何从 Java Springboot 执行复杂的 MongoDB 本机查询

问题描述

我有一个使用 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'}}
])

标签: javamongodbspring-bootmongotemplate

解决方案


一个例子:

考虑集合中的一个文档:

{ _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 文档:数据库命令数据库命令聚合


推荐阅读