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 シェルでは、これは次のようになります。

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 docsによるとJOIN、単一のクエリで複数のコレクションからデータを集約できるSQL に直接相当するものはありません。

于 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 に答える