我有
形式的文件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}}})
哪个似乎不起作用。这些方面有什么用吗?
答案 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}}})