我只有一个收藏品“细节”。它使用不同的别名在查询中使用两次。由于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!
答案 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更快更好。