你能伪造Mongo聚合中的连接吗?

时间:2013-09-14 13:31:34

标签: mongodb

我有

形式的文件
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}}})

哪个似乎不起作用。这些方面有什么用吗?

3 个答案:

答案 0 :(得分: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中也需要模式设计。我建议使用非规范化并将分支名称直接放入成员对象中。

答案 1 :(得分:3)

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

答案 2 :(得分:-2)

我可能有一个解决方案:

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