给定一个数据库

[
{ 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" }
]

我想先按年龄分组,然后按性别分组,这样我就能得到一个嵌套的结果

[{
    _id: "1",
    children: [
        { _id: "f" },
        { _id: "m" }
    ]
}, {
    _id: "2",
    children: [
        { _id: "f" },
        { _id: "m" }
    ]
}, {
    _id: "3",
    children: [
        { _id: "f" },
        { _id: "m" }
    ]
}]

以下是我到目前为止所做的try :

db.example.aggregate(
{ $group: { _id: "$age", children: { $addToSet: {
    age: "$age", gender: "$gender", name: "$name"
}}}},
{ $group: { _id: "$children.gender"}}
)

但结果是{_id: null}.这有可能吗?如果有,怎么可能?

推荐答案

像这样的事情应该可以做到;

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

...它给出了结果;

{
  "_id" : {
    "age" : 1
  },
  "children" : [
    { "gender" : "m", "names" : [ "G", "A" ] },
    { "gender" : "f", "names" : [ "J", "D" ] }
  ]
}, 
...

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

_id: "$_id.age", 

Mongodb相关问答推荐

获取文档字段名并将其作为嵌套字段添加到聚合中

Select 筛选聚合中的嵌套字段

MongoDB - 将属性添加到数组中的对象(如果不存在)

MongoDB 聚合 - $project 和 $match 阶段未按预期工作

MongoDB 聚合 groupBy 日期并计算子文档

如何在 MongoDB 中对字段进行自定义排序

根据条件删除一些数组元素并将数组的大小更新为mongo中的另一个文件

使用MongoDB作为我们的主数据库,我应该使用单独的图数据库来实现实体之间的关系吗?

更新 MongoDB 中嵌套实体数组中的属性

哪种 NoSQL DB 最适合 OLTP 金融系统?

Spring Mongodb @DBREF

MongoDB展开多个数组

Mongoose 中不同集合的相同模式

在 Mongo 中,$near 和 $nearSphere 有什么区别?

有人在 Google App Engine 上try 过 MongoDB 吗?

如何仅通过一次调用将一组对象保存到mongoose数据库?

如何在 $match 内的 mongodb 聚合查询中使用 $regex

如何通过键名从 mongoDB 中检索值?

python + pymongo:如何从 for 循环中在 mongo 中的现有文档上插入新字段

MongoDB - $set 更新或推送数组元素