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重複の可能性に対応するには、次の2つの操作を使用する必要があります。

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

$groupSQL Group by コマンドに似ています。以下の例では、会社が設立された年に基づいて会社を集計します。そして、各企業の平均従業員数を計算します。


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