我需要一些MongoDB聚合的帮助来获得我想要的输出。 目标是直接将结果与请求结合,而不使用php来构建多维数组。
模块集合示例:
{
_id: ObjectID('111111111111111111111'),
name: 'module1'
},
{
_id: ObjectID('111111111111111111112'),
name: 'module2'
}
控制器集合示例:
{
_id: ObjectID('22222222222222222221'),
name: 'controller1'
},
{
_id: ObjectID('22222222222222222223'),
name: 'controller3'
}
动作集合示例:
{
_id: ObjectID('333333333333333333331'),
name: 'action1'
},
{
_id: ObjectID('333333333333333333332'),
name: 'action2'
}
资源集合示例:
{
_id: ObjectID('555555555555555555511'),
module_id: ObjectID('111111111111111111111'),
controller_id: ObjectID('22222222222222222221'),
action_id: ObjectID('333333333333333333331'),
},
{
_id: ObjectID('555555555555555555512'),
module_id: ObjectID('111111111111111111112'),
controller_id: ObjectID('22222222222222222221'),
action_id: ObjectID('333333333333333333332'),
},{
_id: ObjectID('55555555555555555553'),
module_id: ObjectID('111111111111111111111'),
controller_id: ObjectID('22222222222222222223'),
action_id: ObjectID('333333333333333333332'),
},
{
_id: ObjectID('555555555555555555514'),
module_id: ObjectID('111111111111111111112'),
controller_id: ObjectID('22222222222222222221'),
action_id: ObjectID('333333333333333333331'),
},
然后我使用aggregate来检索资源名称。
db.resources.aggregate(
{
{ '$lookup' => { 'from' => 'modules', 'localField' => 'module_id', 'foreignField' => '_id', 'as' => 'module' } },
{ '$unwind' => '$module'],
{ '$lookup' => { 'from' => 'controllers', 'localField' => 'controller_id', 'foreignField' => '_id', 'as' => 'controller' } },
{ '$unwind' => '$controller'},
{ '$lookup' => { 'from' => 'actions', 'localField' => 'action_id', 'foreignField' => '_id', 'as' => 'action' } },
{ '$unwind' => '$action'},
{ '$project' => { '_id' => 1, 'module' => '$module.name', 'controller' => '$controller.name', 'action' => '$action.name'}}
}
)
结果:
[
["_id"] => ObjectID('555555555555555555511'),
["module"] => 'module1',
["controller"] => 'controller1',
["action"] => 'action1',
],
[
["_id"] => ObjectID('555555555555555555512'),
["module"] => 'module2',
["controller"] => 'controller1',
["action"] => 'action2',
],
[
["_id"] => ObjectID('555555555555555555513'),
["module"] => 'module1',
["controller"] => 'controller2',
["action"] => 'action2',
],
[
["_id"] => ObjectID('555555555555555555514'),
["module"] => 'module2',
["controller"] => 'controller1',
["action"] => 'action1',
]
这就是我想要的结果: (我花了很多时间来使用$ group但我找不到解决方案)
[
['module1' =>
['controller1' =>
['action1'] => '555555555555555555511'
],
['controller2']
['action2'] => '555555555555555555513'
],
['module2' =>
['controller1' =>
['action2'] => '555555555555555555512',
['action1'] => '555555555555555555514'
]
]
]
有可能得到这个结果吗?以及如何在不使用php构建此数组的情况下执行此操作?