我正在使用MongoDB,我很享受! 有一个查询我遇到问题: 我有这组代表层次结构的数据(树,其中1是根,1.1和1.2是1的子项,依此类推)
db.test.insert({id:1, hierarchy:"1"})
db.test.insert({id:2, hierarchy:"1.1"})
db.test.insert({id:3, hierarchy:"1.2"})
db.test.insert({id:4, hierarchy:"1.1.1"})
db.test.insert({id:5, hierarchy:"1.1.2"})
db.test.insert({id:6, hierarchy:"1.2.1"})
db.test.insert({id:7, hierarchy:"1.2.2"})
db.test.insert({id:8, hierarchy:"1.2.3"})
所以,如果我进行查询:
> db.test.find()
{ "_id" : ObjectId("546a6095cafd2fa3ff8e4760"), "id" : 1, "hierarchy" : "1" }
{ "_id" : ObjectId("546a6095cafd2fa3ff8e4761"), "id" : 2, "hierarchy" : "1.1" }
{ "_id" : ObjectId("546a6095cafd2fa3ff8e4762"), "id" : 3, "hierarchy" : "1.2" }
{ "_id" : ObjectId("546a6095cafd2fa3ff8e4763"), "id" : 4, "hierarchy" : "1.1.1" }
{ "_id" : ObjectId("546a6095cafd2fa3ff8e4764"), "id" : 5, "hierarchy" : "1.1.2" }
{ "_id" : ObjectId("546a6095cafd2fa3ff8e4765"), "id" : 6, "hierarchy" : "1.2.1" }
{ "_id" : ObjectId("546a6095cafd2fa3ff8e4766"), "id" : 7, "hierarchy" : "1.2.2" }
{ "_id" : ObjectId("546a6095cafd2fa3ff8e4767"), "id" : 8, "hierarchy" : "1.2.3" }
ID为1的文件代表首席执行官,我想收集有关副总裁(1.1和1.2)下的团队的信息。
我希望有这样的输出
{
id: null,
teams:
[
{
manager: 2,
hierarchy: "1.1",
subordinates: 2
},
{
manager: 3,
hierarchy: "1.2",
subordinates: 3
}
]
}
我遇到了在右侧“插槽”中聚合文档的问题。 我尝试使用正则表达式使用子字符串进行聚合,并在分组之前进行投影并创建一个新的字段,该字段将是“manager_hierarchy”,因此我可以使用此字段进行分组。但是,由于没有这些方法,我取得了任何成功,所以我现在被困住了。
无论如何我能完成这项任务吗?
编辑:对不起,我忘了明确说明一件事: 此查询用于获取有关员工的下级团队的信息。我使用了一个例子作为CEO,但如果我是层次结构中的员工1.2.3,我希望看到团队1.2.3.1,1.2.3.2,...,1.2.3.xx
还有可能(罕见,但可能)有人拥有超过9个下属,因此制作“硬编码”子字符串是行不通的,因为
$substr:["$hierarchy",0,3]}
适用于1.2但不适用于1.10 和 $ substr:[“$ hierarchy”,0,4]}
适用于1.10,但不适用于1.2
答案 0 :(得分:3)
您可以使用以下aggregate
管道操作获取结果。
Sort
行基于hierarchy
,以便manager
排在最前面。Group
记录以类似ancestors
开头的记录(即1.1
或1.2,...)。对于每个manager
,top
记录将在group
上
由于上述sort
操作。count
的{{1}},以及group
的数量
将是subordinates
。 count-1(the manager record)
获取单个数组的记录。代码:
group