java - 如何从 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'}}
])
解决方案
一个例子:
考虑集合中的一个文档:
{ _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 文档:数据库命令和数据库命令聚合。
推荐阅读
- reactjs - ReactJS - 多页应用程序在为生产而构建后无法正常工作
- r - mgcv:如何在 predict.gam 中使用“排除”参数?
- flutter - 如何调试颤振单元测试?
- xamarin.forms - 折线图显示点击点的信息
- css - 怎么获得
- gradle - libgdx SpriteBatch UnsatisfiedLinkError 桌面
- mysql - 在 unity3d 中从 mySQL 获取图像到 3D 模型中
- matplotlib - 将一个没有数据的类别添加到 seaborn 的绘图中
- css - withStyles 中的 min()
- python - 按行点积列python - numpy