私はmongoドキュメントの列で最高の値を取得するためにいくつかの助けを求めてきました。並べ替えて上/下を取得することはできますが、もっと良い方法があると確信しています。
私は以下を試しました(そしてさまざまな組み合わせ):
transactions.find("id" => x).max({"sellprice" => 0})
しかし、それはエラーをスローし続けます。上/下を並べ替えて取得する以外に、それを行うための良い方法は何ですか?
ありがとうございました!
私はmongoドキュメントの列で最高の値を取得するためにいくつかの助けを求めてきました。並べ替えて上/下を取得することはできますが、もっと良い方法があると確信しています。
私は以下を試しました(そしてさまざまな組み合わせ):
transactions.find("id" => x).max({"sellprice" => 0})
しかし、それはエラーをスローし続けます。上/下を並べ替えて取得する以外に、それを行うための良い方法は何ですか?
ありがとうございました!
max()は、SQLforMongoで期待するようには機能しません。これは将来のバージョンで変更される可能性がありますが、現時点では、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シェルコードの例。
グループの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"}
}
}
)
アグリゲート()を使用する:
db.transactions.aggregate([
{$match: {id: x}},
{$sort: {sellprice:-1}},
{$limit: 1},
{$project: {sellprice: 1}}
]);
それはあなたの要件に従って動作します。
transactions.find("id" => x).sort({"sellprice" => -1}).limit(1).first()
列のインデックスが作成されている場合、Mongoがインデックスを使用して順序付けられたコレクションを取得すると仮定すると、並べ替えは問題ありません。それ以外の場合は、表示された最大値をメモして、コレクションを反復処理する方が効率的です。例えば
max = nil
coll.find("id" => x).each do |doc|
if max == nil or doc['sellprice'] > max then
max = doc['sellprice']
end
end
(私のRubyが少し厄介な場合は、長い間使用していませんが、一般的なアプローチはコードから明確になっているはずです。)
Rubyドライバーを使用していると仮定すると(下部にmongodb-rubyタグが表示されています)、最大値を取得したい場合は次のようにします_id
(ソート可能であると仮定します_id
)。私の実装では、私_id
は整数でした。
result = my_collection.find({}, :sort => ['_id', :desc]).limit(1)
_id
コレクションの最小値を取得するには、次のように変更:desc
します。:asc
次のクエリは同じことをします:
db.student.find({}, {'_id':1}).sort({_id:-1}).limit(1)
私にとって、これは次の結果を生み出しました:
{ "_id" : NumberLong(10934) }