1

コレクションの「詳細」は 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 で行き詰まっています。

4

1 に答える 1

1

スキーマを変更して答えを見つけました:

{
"_id": ObjectId("5114a7eb9d5d0c640900001e"),
"user_id": "5114a7eb9d5d0c640900001d",
"username": "user8",
"refer_username": "user7",
"refer_id": "5114a7c59d5d0c6409000018",
    "ancestors": {
    "0": null,
     "1": "Initial",
     "2": "user6",
     "3": "user7"
    },
}   

これにより、次のクエリを使用してすべての先祖を見つけることができました。

 user_id = '5114a7eb9d5d0c640900001d'
 db.details.find({'user_id':user_id});

次のクエリを使用して、すべての子孫を取得します。

 username = 'user8'
 db.details.find('ancestors':username)

Map/Reduce を使用せずに、集約フレームワークを使用し、$unwind 関数を使用して、ユーザーのすべての先祖と子孫を数えることができます。

このページを確認できます: http://docs.mongodb.org/manual/tutorial/model-tree-structures/ MongoDB のモデル ツリー構造の理解を本当に向上させます。MySQL より高速で優れています。

于 2013-02-09T07:34:45.700 に答える