1

私はmongodbに600万を超えるドキュメントコレクションを持っています。そして、そのフィールドの1つ(以下の例ではfield1とfield2)は文字列値(mongodbのタイプ2)です。

私の問題は、それらをfloat値に解析したいということです(すべての値は parseFloat可能です)。このスニペットはSOで見つかりました。しかし、6Mのドキュメントコレクションを処理するための優れたソリューションではないようです。

db.collection.find({field1: {$type:1}}).forEach(function(data) {
    db.collection.update(
         {_id:data._id},
         {$set:{
              field1: parseFloat(data.field1),
              field2: parseFloat(data.field2)}
          }
    )
})

サーバーの速度を落とさずに2つのフィールドを変換する方法はありますか?

db.collection.getIndexes()とdb.collection.getIndexKeys()を使用すると、2つのフィールドにインデックスが付けられます。

4

2 に答える 2

0

forEachを使用してドキュメントごとに1つの更新コマンドを実行する代わりに、複数のドキュメントの更新を実行できるように、更新の4番目の引数をtrueに設定してみましたか?

于 2012-11-14T22:14:28.207 に答える
0

サーバーの速度低下を防ぐことが目標である場合は、更新の間にクライアント側でスリープを導入します。軽減する負荷の量と、更新が完了するまでの忍耐力に応じて、タイムアウトを調整できます。スリープを強制するには、mongoシェルで「sleep(ms)」を呼び出します。「ms」は、スリープするミリ秒数です。

于 2012-11-13T15:42:51.243 に答える