45

假设我的 MongoDB 架构如下所示:

{car_id: "...", owner_id: "..."}

这是一个多对多的关系。例如,数据可能如下所示:

+-----+----------+--------+
| _id | owner_id | car_id |
+-----+----------+--------+
|   1 |        1 |      1 |
|   2 |        1 |      2 |
|   3 |        1 |      3 |
|   4 |        2 |      1 |
|   5 |        2 |      2 |
|   6 |        3 |      4 |
|   7 |        3 |      5 |
|   8 |        3 |      6 |
|   9 |        3 |      7 |
|  10 |        1 |      1 | <-- not unique
+-----+----------+--------+

我想得到每个车主拥有的汽车数量。在 SQL 中,这可能看起来像:

SELECT owner_id, COUNT(*) AS cars_owned
FROM (SELECT owner_id FROM car_owners GROUP BY owner_id, car_id) AS t
GROUP BY owner_id;

在这种情况下,结果将如下所示:

+----------+------------+
| owner_id | cars_owned |
+----------+------------+
|        1 |          3 |
|        2 |          2 |
|        3 |          4 |
+----------+------------+

如何使用聚合框架使用 MongoDB 完成同样的事情?

4

2 回答 2

74

为了适应潜在的重复,您需要使用两个$group操作:

db.test.aggregate([
    { $group: {
        _id: { owner_id: '$owner_id', car_id: '$car_id' }
    }},
    { $group: {
        _id: '$_id.owner_id',
        cars_owned: { $sum: 1 }
    }},
    { $project: {
        _id: 0,
        owner_id: '$_id',
        cars_owned: 1
    }}]
    , function(err, result){
        console.log(result);
    }
);

给出格式为:

[ { cars_owned: 2, owner_id: 10 },
  { cars_owned: 1, owner_id: 11 } ]
于 2012-11-05T22:09:56.323 回答
0

$group类似于 SQL Group by command。在下面的示例中,我们将根据公司成立的年份汇总公司。并计算每家公司的平均员工人数。


db.companies.aggregate([{
    $group: {
      _id: {
        founded_year: "$founded_year"
      },
      average_number_of_employees: {
        $avg: "$number_of_employees"
      }
    }
  }, {
    $sort: {
      average_number_of_employees: -1
    }
  }
])

$avg 运算符 MongoDB

此聚合管道有 2 个阶段

  1. $group
  2. $sort

现在,$group舞台的基础是_id我们指定为文档一部分的字段。这就是$group运算符本身的值,它使用了对代理框架语法的非常严格的解释。_id是我们如何定义、如何控制、如何调整小组赛阶段用来组织它看到的文档的方式。

以下查询使用$sum运算符查找人员与公司的关系:


db.companies.aggregate([{
  $match: {
    "relationships.person": {
      $ne: null
    }
  }
}, {
  $project: {
    relationships: 1,
    _id: 0
  }
}, {
  $unwind: "$relationships"
}, {
  $group: {
    _id: "$relationships.person",
    count: {
      $sum: 1
    }
  }
}, {
  $sort: {
    count: -1
  }
}])

MongoDB 中的 $sum

于 2016-09-23T23:41:22.810 回答