使用字段的子字符串对文档进行分组

时间:2014-11-17 21:05:41

标签: regex mongodb

我正在使用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

1 个答案:

答案 0 :(得分:3)

您可以使用以下aggregate管道操作获取结果。

  • Sort行基于hierarchy,以便manager 排在最前面。
  • Group记录以类似ancestors开头的记录(即1.1 或1.2,...)。对于每个managertop记录将在group上 由于上述sort操作。
  • 获取每个count的{​​{1}},以及group的数量 将是subordinates
  • 再次count-1(the manager record)获取单个数组的记录。

代码:

group