39

私は学生とその連絡先の詳細のデータベースを持っています。私は最も多くの学生を収容する郵便番号を見つけようとしています。学生向けの資料はこんな感じ…

{学生コード:'smi0001'、名:'bob'、名前:'smith'、郵便番号:2001}

集計フレームワークを使用して、次のようなことを行うことで、ほとんどの学生の郵便番号を見つけることができると思いました...

db.students.aggregate({$project: { postcode: 1 }, $group: {_id: '$postcode', students: {$sum: 1}}})

これは期待どおりに機能します(郵便_id番号を「students」として返し、各郵便番号の学生数を「students」として返しますが$sort、パイプラインに追加すると、操作の結果ではなく、学生コレクション全体で並べ替えようとしているよう$groupです。

私が試しているのはどのように見えるか...

db.students.aggregate({$project: { postcode: 1 }, $group: {_id: '$postcode', students: {$sum: 1}}, $sort: {_id: -1}})

しかし、それはコレクション全体を返し、とを無視し$projectます$group...私は何かが欠けていますか?生徒数の降順で並べ替えて、最初のアイテムを返すだけでいいのではないかと思いました。助けてくれてありがとう。

4

2 に答える 2

76

あなたはほとんどそれを持っていました...

db.test.aggregate(
  {$group: {_id: '$postcode', students: {$sum: 1}}}, 
  {$sort: {_id: -1}}
);

与える(私はあなたのサンプルに一致するいくつかのテストデータを追加しました):

{
  "result" : [
    {
        "_id" : 2003,
        "students" : 3
    },
    {
        "_id" : 2002,
        "students" : 1
    },
    {
        "_id" : 2001,
        "students" : 2
    }
  ],
  "ok" : 1
}

あなたはすべての周りにアウターを持っていました{}、それはいくつかの混乱を引き起こしていました。グループとソートは、パイプラインで別々の操作として機能していませんでした。

この場合、プロジェクトは実際には必要ありませんでした。

更新おそらく、「学生」で並べ替えて、最初に最大の郵便番号(人口別)を取得することをお勧めします。

db.test.aggregate(
  {$group: {_id: '$postcode', students: {$sum: 1}}}, 
  {$sort: {students: -1}}
);
于 2012-09-16T23:24:46.870 に答える
5

あなたの構文は少し間違っていると思います。パイプラインの各集計操作は、独自のドキュメントである必要があります。

db.students.aggregate( {$project: ...}, {$group: ...}, {$sort: ...} )

あなたの場合、それは次のようになります。

db.students.aggregate(
    {$project: { postcode: 1 }}, 
    {$group: {_id: '$postcode', students: {$sum: 1}}}, 
    {$sort: {students: -1}}
)

私はあなたのスキーマに基づいたサンプルコレクションでそれをテストしました、そしてそれは私のために働きます、学生の数によってグループ化された郵便番号を降順でソートします。

于 2012-09-16T23:39:16.670 に答える