コレクションの「詳細」は 1 つしかありません。異なるエイリアスでクエリで 2 回使用されています。Mongo にはエイリアスがないので、mapreduce で結果が得られると思います。アンワインドで集計も試しましたが、コレクションではなくフィールドでアンワインドされます。集計または mapreduce に関するヘルプ。
Collection:
"details"
{
"user_id":1,
"lft":2
"rgt":5
},
{
"user_id":2,
"lft":1
"rgt":6
},
{
"user_id":3,
"lft":3
"rgt":4
}
SQL クエリ:
SELECT CONCAT( REPEAT('-', COUNT(parent.user_id) - 1), node.user_id)
AS user_id
FROM details AS node,
details AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.user_id
ORDER BY node.lft;
次のように出力されます。
1
-2
--3
私が試してみました:
$mongodb = Connections::get('default')->connection;
$details = Details::connection()->connection->command(array(
'aggregate' => 'details',
'pipeline' => array(
array('$project' => array(
'_id' => array(
'parent'=>array(
'puser_id'=>'$user_id',
'pleft'=>'$left',
'pright'=>'$right',
),
'node'=>array(
'nuser_id'=>'$user_id',
'nleft'=>'$left',
'nright'=>'$right',
)
),
),
'$group'=>array('_id'=>'$_id.parent.puser_id'),
'$match' => array(
'$_id.node.nleft'=>array('$gt'=>'$_id.parent.pleft'),
'$_id.node.nright'=>array('$gt'=>'$_id.parent.pright')
)
),
)
));
$group と $match で行き詰まっています。