1

我只有一个集合“详细信息”。它以不同的别名在查询中使用两次。由于 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 回答