MongoDB查询相同的集合与count

时间:2013-01-13 03:41:20

标签: mongodb mapreduce aggregation-framework

我只有一个收藏品“细节”。它使用不同的别名在查询中使用两次。由于Mongo没有别名,我认为mapreduce会给出结果。 我也尝试使用unwind进行聚合,但是它会在字段上展开而不是在集合上展开。 有关聚合或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!

1 个答案:

答案 0 :(得分: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更快更好。