28

MongoDB 、MongooseJS および Nodejs を使用しています。

次のフィールドを持つコレクション( Member と呼ばれる)があります-

Country_id 、 Member_id 、名前、スコア

国ID = 10の最大スコアを持つメンバーを返すクエリを書きたい

MongooseJS でこれに関する適切なドキュメントを見つけることができませんでした。

これは StackOVerflow で見つけました (これは MongoDB コードです)

Model.findOne({ field1 : 1 }).sort(last_mod, 1).run( function(err, doc) {
     var max = doc.last_mod;
});

しかし、同じものを MongooseJS に変換するにはどうすればよいでしょうか?

4

5 に答える 5

48
Member
  .findOne({ country_id: 10 })
  .sort('-score')  // give me the max
  .exec(function (err, member) {

    // your callback code

  });

クエリについてはマングースのドキュメントを確認してください。かなり優れています。

同じコードをもう一度書きたくない場合は、次のように Member モデルに静的メソッドを追加することもできます。

memberSchema.statics.findMax = function (callback) {

  this.findOne({ country_id: 10 }) // 'this' now refers to the Member class
    .sort('-score')
    .exec(callback);
}

そして後でそれを呼び出すMember.findMax(callback)

于 2013-11-03T10:00:58.117 に答える
13

これを行うために Mongoose のドキュメントは必要ありません。プレーンMongoDbが仕事をします。

Memberコレクションがあるとします。

{ "_id" : ObjectId("527619d6e964aa5d2bdca6e2"), "country_id" : 10, "name" : "tes2t", "score" : 15 }
{ "_id" : ObjectId("527619cfe964aa5d2bdca6e1"), "country_id" : 10, "name" : "test", "score" : 5 }
{ "_id" : ObjectId("527619e1e964aa5d2bdca6e3"), "country_id" : 10, "name" : "tes5t", "score" : -6 }
{ "_id" : ObjectId("527619e1e964aa5d2bdcd6f3"), "country_id" : 8, "name" : "tes5t", "score" : 24 }

次のクエリは、探しているドキュメントへのカーソルを返します。

 db.Member.find({country_id : 10}).sort({score : -1}).limit(1)
于 2013-11-03T09:51:47.157 に答える
3

これは、Mongoose クエリ ヘルパーを使用してすばやく簡単に行うことができます。

これの一般的な形式は次のようになります。

<Your_Model>.find()
   .sort("-field_to_sort_by")
   .limit(1)
   .exec( (error,data) => someFunc(error,data) {...} );

tldr: これにより、「field_to_sort_by」の値が最も高い単一アイテムの配列が得られます。1 時間行ったように、data[0] としてアクセスすることを忘れないでください。

長文: 関数の文字列が何をしているかを段階的に説明します...

Your_Model.find()クエリを開始します。引数は必要ありません。

.sort("-field_to_sort_by")すべてを降順にソートします。フィールド名の前のマイナス記号は、降順でソートすることを指定します。これを破棄して昇順でソートし、最小値のドキュメントを取得できます。

.limit(1)最上位のドキュメントのみが必要なため、最初のドキュメントのみを返すようにデータベースに指示します。

.exec( (error,data) => someFunc(error,data) {...} )最後に、エラーとドキュメントを含む配列を関数に渡します。ドキュメントは次の場所にあります。data[0]

于 2018-12-02T00:06:12.780 に答える