web-dev-qa-db-ja.com

MongoDBの列の最高値を取得する

Mongoドキュメントの列で最高の値を取得するための支援をしてきました。私はそれを並べ替えて上位/下位を取得できますが、それを行うためのより良い方法があると確信しています。

私は次のことを試しました(さまざまな組み合わせ):

transactions.find("id" => x).max({"sellprice" => 0})

しかし、それはエラーを投げ続けます。トップ/ボトムをソートして取得する以外に、それを行う良い方法は何ですか?

ありがとうございました!

28
roloenusa

max()は、MongoのSQLで期待するようには機能しません。これはおそらく将来のバージョンで変更される予定ですが、現時点では、max、minは主にシャーディングのために内部的にインデックス付きキーと共に使用される予定です。

参照 http://www.mongodb.org/display/DOCS/min+and+max+Query+Specifiers

残念ながら、現時点では、最大値を取得する唯一の方法は、コレクションの説明をその値に基づいて並べ替え、最初に取得することです。

transactions.find("id" => x).sort({"sellprice" => -1}).limit(1).first()
48
Michael Papile

並べ替えはやり過ぎかもしれません。あなただけでグループを行うことができます

db.messages.group(
           {key: { created_at:true },
            cond: { active:1 },
            reduce: function(obj,prev) { if(prev.cmax<obj.created_at) prev.cmax = obj.created_at; },
            initial: { cmax: **any one value** }
            });
19
Mayur Rustagi
db.collectionName.aggregate(
  {
    $group : 
    {
      _id  : "",
      last : 
      {
        $max : "$sellprice"
      }
    }
  }
)
8
user2418693

集計を計算するためのmongodb Shellコードの例。

グループ(多くのアプリケーション)のmongodb手動エントリを参照してください:: http://docs.mongodb.org/manual/reference/aggregation/group/#stage._S_group

以下では、$ varsをコレクションキーとターゲット変数に置き換えます。

db.activity.aggregate( 
  { $group : {
      _id:"$your_collection_key", 
      min: {$min : "$your_target_variable"}, 
      max: {$max : "$your_target_variable"}
    }
  } 
)
5
jatal

それはあなたの要件に従って動作します。

transactions.find("id" => x).sort({"sellprice" => -1}).limit(1).first()
3
Shariq Ansari

Aggregate()を使用します。

db.transactions.aggregate([
  {$match: {id: x}},
  {$sort: {sellprice:-1}},
  {$limit: 1},
  {$project: {sellprice: 1}}
]);
3
Vincent

Rubyドライバー(下部にmongodb-Rubyタグが表示されていました)を使用していたとすると)、最大値を取得したい場合は、次のようにします_id(私の_idはソート可能です)。私の実装では、私の_idは整数でした。

result = my_collection.find({}, :sort => ['_id', :desc]).limit(1)

最小値を取得するには_idコレクション内で、:desc:asc

0
briangonzalez

列にインデックスが付けられている場合、Mongoがインデックスを使用して順序付けられたコレクションを取得すると仮定すると、並べ替えはOKになります。それ以外の場合は、最大の値を記録して、コレクションを反復処理する方が効率的です。例えば.

max = nil
coll.find("id" => x).each do |doc| 
    if max == nil or doc['sellprice'] > max then
        max = doc['sellprice'] 
    end
end

(申し訳ありませんが、Rubyが少し不安定な場合は、長い間使用していませんでしたが、一般的なアプローチはコードから明らかです。)

0
Simon Whitaker

次のクエリは同じことを行います:db.student.find({}, {'_id':1}).sort({_id:-1}).limit(1)

私にとって、これは次の結果をもたらしました:{ "_id" : NumberLong(10934) }

0
Manish