0

私のJSONドキュメント(「i」と呼ばれる)には、サブドキュメント(「要素」と呼ばれる)があります。私はこれらのサブドキュメントをループして、一度に1つずつ更新しています。ただし、これを行うには(必要な値が計算されたら)、データベース内のすべてのドキュメントをスキャンし、次にすべてのサブドキュメントをスキャンして、更新する必要のあるサブドキュメントを見つけます。

約3000のドキュメントがあり、これには約4分かかるため、大きな時間の問題が発生しています。mongoがすべてのドキュメントをスキャンする必要はなく、ループ内でスキャンすることで、これを行うためのより迅速な方法があるかどうかを知りたいと思います。

コードは次のとおりです。

for i in db.stuff.find():

    for element in i['counts']:

        computed_value = element[a] + element[b]
        db.stuff.update({'id':i['id'], 'counts.timestamp':element['timestamp']}, 
                        {'$set': {'counts.$.total':computed_value}})

ドキュメント全体を「id」で識別し、次にサブドキュメントをそのタイムスタンプ(各サブドキュメントに固有)で識別しています。これよりも早い方法を見つける必要があります。ご協力ありがとうございました。

4

2 に答える 2

1
  1. あなたのアップデートはidに基づいています(そして私はそれがmongoのデフォルトの_idとは異なると思います)あなたのidフィールドにインデックスを置きます

  2. コレクション内のすべてのドキュメントに新しいフィールドを設定したいですか、それとも特定の基準に一致するコレクションに対してのみ新しいフィールドを設定したいですか?コレクションを照合する場合のみ、クエリ演算子を使用します(可能な場合はインデックスを使用)

  3. 完全なドキュメントをフェッチしないでください。使用されているフィールドのみをフェッチしてください。

  4. ドキュメントの平均サイズはどれくらいですか?Explainとmongostatを使用して、実際のボトルネックを理解します。

于 2012-12-04T21:31:14.020 に答える
1

コレクションにはどのようなインデックスがありますか? これは、埋め込みドキュメントにインデックスを作成することでおそらく高速化できます。ドット表記を使用してこれを行うことができます -ここに良い説明と例があります。

あなたの場合、次のようなことをします

db.stuff.ensureIndex( { "i.elements.timestamp" : 1 });

これにより、埋め込みドキュメントの検索が大幅に高速化されます。

于 2012-12-04T21:09:49.450 に答える