使用multidimention数组的Mongodb聚合构建输出

时间:2016-12-18 00:51:04

标签: php mongodb multidimensional-array aggregation-framework

我需要一些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构建此数组的情况下执行此操作?

0 个答案:

没有答案