java - 如何从 Java Spring Boot 执行复杂的 MongoDB native 查询

标签 java mongodb spring-boot mongotemplate

我有一个使用 3 个集合创建 View 的复杂查询。查询是在 native 级别编写的。我需要从 Java 执行该查询,有什么方法可以从 Java 级别执行这些类型的查询。也许是一个将 MongoDB native 查询作为字符串并在数据库级别执行的函数

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'}}
])

最佳答案

一个例子:

考虑集合中的文档:

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

以及来自 mongo shell 的以下聚合:

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 文档:Database CommandsDatabase Command Aggregate .

关于java - 如何从 Java Spring Boot 执行复杂的 MongoDB native 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62461582/

相关文章:

javascript - Android:将 html 字符串从 java 传递到 javascript

java - 为什么 hibernate 不删除行?

javascript - Mongoose - find() 在没有传递参数时不返回任何内容,但在传递参数时返回数据

node.js - Mongodb 模式在几秒后清空

spring - 摆脱 spring-boot-starter-data-mongodb 对易受攻击的 Log4J 版本的依赖

Java Classloader 默认类加载器

node.js - 在MongoDB中更新和返回文档

java - Spring Boot 升级时找不到 log4j 文件问题

java - 在 JSON 配置文件中注入(inject) Spring Boot 应用程序属性

java - Android studio - Button 元素上的 onClick 属性 "give class or interface expected"错误