使用MongoDB嵌套分组

hie*_*ppe 18 mongodb aggregation-framework

给定数据库的形式

[
{ gender: "m", age: 1, name: "A" },
{ gender: "f", age: 2, name: "B" },
{ gender: "m", age: 3, name: "C" },
{ gender: "f", age: 1, name: "D" },
{ gender: "m", age: 2, name: "E" },
{ gender: "f", age: 3, name: "F" },
{ gender: "m", age: 1, name: "G" },
{ gender: "f", age: 2, name: "H" },
{ gender: "m", age: 3, name: "I" },
{ gender: "f", age: 1, name: "J" }
]
Run Code Online (Sandbox Code Playgroud)

我希望首先按年龄分组,然后按性别分组,以便我得到一个类似的嵌套结果

[{
    _id: "1",
    children: [
        { _id: "f" },
        { _id: "m" }
    ]
}, {
    _id: "2",
    children: [
        { _id: "f" },
        { _id: "m" }
    ]
}, {
    _id: "3",
    children: [
        { _id: "f" },
        { _id: "m" }
    ]
}]
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止尝试的内容:

db.example.aggregate(
{ $group: { _id: "$age", children: { $addToSet: {
    age: "$age", gender: "$gender", name: "$name"
}}}},
{ $group: { _id: "$children.gender"}}
)
Run Code Online (Sandbox Code Playgroud)

但是这会返回一个{_id: null}结果.这是可能的,万一是的,怎么样?

Joa*_*son 49

这样的事情应该做到;

db.example.aggregate( 
  { 
    $group: { 
      _id:   { age: "$age", gender: "$gender" }, 
      names: { $addToSet: "$name" } 
    } 
  }, 
  { 
    $group: {
      _id: { age: "$_id.age" }, 
      children: { $addToSet: { gender: "$_id.gender", names:"$names" } } 
    } 
  } 
)
Run Code Online (Sandbox Code Playgroud)

...给出了结果;

{
  "_id" : {
    "age" : 1
  },
  "children" : [
    { "gender" : "m", "names" : [ "G", "A" ] },
    { "gender" : "f", "names" : [ "J", "D" ] }
  ]
}, 
...
Run Code Online (Sandbox Code Playgroud)

如果你想要_id你的例子中的年龄,只需将第二个分组替换为_id;

_id: "$_id.age", 
Run Code Online (Sandbox Code Playgroud)

  • 我一直在寻找这个,因为我一直试图重新创造,但还有一个问题,我如何计算性别?每个年龄段性别出现多少次? (2认同)