0

私はかなり奇妙な問題に遭遇しました。私のアプリには、約 4 800 000 レコードの mongo コレクションがあります。このコレクションから 2 400 000 レコードを返すクエリを使用しています。したがって、それらを繰り返し処理し、各レコードに埋め込みドキュメントを作成します。ログを調べていると、反復が 400 万回以上行われていることに気付きました。さらに深く掘り下げたところ、多くのレコードが反復に何度も含まれていることがわかりました。これは、同じ ID を持つレコードが、ログで複数回処理されたものとして表示されたことを意味します。以下はクエリです。

MyModel.where({integer_array: {"$not" => {'$size' => 0}}}).all.each do |n|

非常に奇妙なのは、Rails コンソールで実行するMyModel.where({integer_array: {"$not" => {'$size' => 0}}}).countと、結果として約 2400000 になることです。Rails 3.2.13、mongoid 3.0.21、mongodb 2.4.0 で実行しています。

4

1 に答える 1

2

mongodb のカーソルはデフォルトで潜在的です。これは、カーソルの処理中にさらに書き込みが発生した場合、これらの更新の結果が表示される場合と表示されない場合があることを意味します。

基本的に、データが追加されたり、既存のデータが変更されたりすると、オブジェクトがコレクション内を移動し、カーソルに複数回表示される場合があります (実際の動作は指定されていません)。

この問題を解決するには、クエリでpass mongoid the snapshotオプションを使用します。

( 「_id」インデックスを指定するヒントオプションを使用することもできます。)

于 2013-06-05T12:55:26.750 に答える