フィルタリングクエリを実行する前に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
の値を昇順にソートしてフィルタリングできたら、正しい値が見つかるまで検索を続けます。
誤った結果をもたらすサンプルドキュメントとクエリを追加してください。 –
申し訳ありませんが、サンプルデータが追加されました。 – RhoVisions
私は、実際のデータをランダムな値を持つフィールドと混合するのは良い考えだとは思いません。 $ sampleを使用して文書からこのフィールドを削除することを検討してください –