1. ホーム
  2. mongodb

[解決済み] mongodb aggregation sort

2022-02-19 06:13:04

質問

私は学生とその連絡先のデータベースを持っています。 私は、最も多くの学生を収容する郵便番号を見つけようとしています。 学生のドキュメントは、次のようになります...

<ブロッククオート

{studentcode: 'smi0001', 名字: 'bob', 姓: 'smith', 郵便番号: 2001}

集計フレームワークを使って、学生の多い郵便番号を調べるには、次のようにすればいいと思いました。

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

これは期待通りに動作します(郵便番号を _id で、各郵便番号の生徒数は 'students' となります。 $sort の結果ではなく、student コレクション全体でソートしようとするようです。 $group 演算を行うことができます。

こんな感じです。

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

が、コレクション全体を返すので $project$group ... 何か見落としているのでしょうか?生徒数の降順でソートして、最初の項目を返せばいいと思っていたのですが。 何かありましたら、よろしくお願いします。

どのように解決するのですか?

あと少しだったのに...。

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
}

あなたは、外側の {} をすべて囲んでしまい、それが混乱の原因となっていました。グループとソートは、パイプラインの中で別々の操作として機能していなかったのです。

この場合、プロジェクトは本当に必要なかったんですね。

更新情報 おそらく、このように "students" でソートして、(人口で)最大の郵便番号を最初に取得したいのでしょう。

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