我有一个使用 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 Commands和 Database Command Aggregate .
关于java - 如何从 Java Spring Boot 执行复杂的 MongoDB native 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62461582/