Mongoドキュメントの列で最高の値を取得するための支援をしてきました。私はそれを並べ替えて上位/下位を取得できますが、それを行うためのより良い方法があると確信しています。
私は次のことを試しました(さまざまな組み合わせ):
transactions.find("id" => x).max({"sellprice" => 0})
しかし、それはエラーを投げ続けます。トップ/ボトムをソートして取得する以外に、それを行う良い方法は何ですか?
ありがとうございました!
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()
並べ替えはやり過ぎかもしれません。あなただけでグループを行うことができます
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** }
});
db.collectionName.aggregate(
{
$group :
{
_id : "",
last :
{
$max : "$sellprice"
}
}
}
)
集計を計算するための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"}
}
}
)
それはあなたの要件に従って動作します。
transactions.find("id" => x).sort({"sellprice" => -1}).limit(1).first()
Aggregate()を使用します。
db.transactions.aggregate([
{$match: {id: x}},
{$sort: {sellprice:-1}},
{$limit: 1},
{$project: {sellprice: 1}}
]);
Rubyドライバー(下部にmongodb-Rubyタグが表示されていました)を使用していたとすると)、最大値を取得したい場合は、次のようにします_id
(私の_id
はソート可能です)。私の実装では、私の_id
は整数でした。
result = my_collection.find({}, :sort => ['_id', :desc]).limit(1)
最小値を取得するには_id
コレクション内で、:desc
〜:asc
列にインデックスが付けられている場合、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が少し不安定な場合は、長い間使用していませんでしたが、一般的なアプローチはコードから明らかです。)
次のクエリは同じことを行います:db.student.find({}, {'_id':1}).sort({_id:-1}).limit(1)
私にとって、これは次の結果をもたらしました:{ "_id" : NumberLong(10934) }