2017-11-08 8 views
1

フィルタリングクエリを実行する前にMongoコレクションでソートを実行できますか?私は、0から1の間のランダムな浮動小数点数のフィールドを持つことによってデータベースからランダムな結果を取得する方法を使用していた古いコードを持っていて、findOneでクエリを実行し、ランダムな浮動小数点その時に生成される。サンプルセットは小さかったので、当時は問題に気づいていませんでしたが、最近、1つのクエリでほぼ同じ値を得ていることがわかりました。 "最初の"文書はランダム.9を持っていたので、ほぼすべてのクエリが最初に一致しました。クエリ前にソート

私は、このソリューションが機能するために、ランダムに並べ替える必要があることを認識してから、最初の値を自分のランダムよりも大きくする必要があります。私はそれを理解しているので、これは過去のような解決策ではありません。なぜなら、$sampleは3.2のように存在しますが、私はこれをどうやってやることができるかを学んでいます。さらに、私の理解では、$sampleは同じ文書を何度も返すことができます(N> 1は明らかに私の質問には直接当てはまらない)。例えばので

、次のデータ:xは0.91までの任意の値が常に(553c072 _id)最初のオブジェクトを返すですdb.mycollection.findOne({'random': {'$gte': x}})を実行するための

> db.links.find() 
{ "_id" : ObjectId("553c072bc87652a80e00002a"), "random" : 0.9162904409691691 } 
{ "_id" : ObjectId("553c3332c87652c80700002a"), "random" : 0.00427396921440959 } 
{ "_id" : ObjectId("553c3c5cc87652a80e00002b"), "random" : 0.2409569111187011 } 
{ "_id" : ObjectId("553c3c66c876521c10000029"), "random" : 0.35101076657883823 } 
{ "_id" : ObjectId("553c3c6ec87652200700002e"), "random" : 0.3234482416883111 } 
{ "_id" : ObjectId("553c68d5c87652a80e00002c"), "random" : 0.5221220930106938 } 

いかなる試みも。より大きなものは何も返しません。 randomの値を昇順にソートしてフィルタリングできたら、正しい値が見つかるまで検索を続けます。

+0

誤った結果をもたらすサンプルドキュメントとクエリを追加してください。 –

+0

申し訳ありませんが、サンプルデータが追加されました。 – RhoVisions

+2

私は、実際のデータをランダムな値を持つフィールドと混合するのは良い考えだとは思いません。 $ sampleを使用して文書からこのフィールドを削除することを検討してください –

答えて

1

カスタムソリューションを削除して、MongoDB組み込みの$sampleステージを使用することを強くお勧めします。このステージでは、あなたのコレクションからランダムな結果が返されます。あなたのコメントに基づいて

EDIT

はここであなたは、もともとを求め何ができる方法は次のとおりです。

db.links.find({ "random": { $gte: /* put your value here */ } }) 
.sort({ "random": 1 /* sort by "random" field in ascending order */ }) 
.limit(1) 

することができますが、あまりにも、aggregation frameworkを使用する必要はありません。

db.links.aggregate({ 
    $match: { 
     "random": { 
      $gte: /* put your value here */ // filter the collection 
     } 
    } 
}, { 
    $sort: { 
     "random": 1 // sort by "random" field in ascending order 
    } 
}, { 
    $limit: 1 // return only the first element 
}) 
+0

私は '$ sample'(この問題を解明しようとする過程で見つけたもの)について学んだので、この解決法を廃止しようと考えていますが、他のシナリオでこれを実装する方法を学びたいと考えていました例えば、文字で始まるアルファベット順に最初の5つの文書を取得したい場合などです。 – RhoVisions

+0

ありがとう!以前は集合体を調べていましたが、そのようなことについては考えていませんでした。すべての値を自分の値よりも大きくしてから、順序付けされた集合に1つだけ戻します。私も集約なしでこれを行うことができるはずですよね? – RhoVisions

関連する問題