5

我有表格的文件

members:
    {
    _id:ObjectId("xxx"),
    name:"John",
    branch:ObjectId("yyy")
    }

branches:
    {
    _id:ObjectId("yyy"),
    name:"Branch A"
    }

我想报告每个分支机构的人数。一个直接的 $group 管道可以做到这一点,但我只能让它报告分支 _id,然后在我的代码中转换它。我想做类似的事情:

db.members.aggregate(
    {$group:{_id:db.branches.findOne(
        {_id:"$branch"},
        {name:1}).name,count:{$sum:1}}})

这似乎不起作用。这些方面有什么可行的吗?

4

3 回答 3

7

您可以迭代聚合的结果并查询名称。在 mongo shell 中,这看起来像:

db.members.aggregate(
    { $group: { _id: "$branch", count: { $sum: 1 } }
}).result.forEach(function(val, idx) {
    var branch = db.branches.findOne( { _id: val._id.$id } );
    val.name = branch.name;
    printjson(val);
 })

如果您使用语言驱动程序,请在结果上进行聚合和迭代,并对分支名称进行单独查询。这是一个很好的例子,为什么在 MongoDB 中也需要模式设计。我建议非规范化并将分支名称直接放入成员对象中。

于 2013-09-14T14:10:14.410 回答
3

根据MongoDB Aggregation 文档,SQL 没有直接的等价物JOIN,它允许在单个查询中聚合来自多个集合的数据。

于 2013-09-14T13:59:56.007 回答
-2

我可能有一个解决方案:

db.members.aggregate(
    {$group:{_id:db.branches.findOne(
    {_id:this.branch},
    {name:1}).name,count:{$sum:1}}})
于 2014-07-16T20:14:16.577 回答