1

MongoDB データベースを構築していますが、エントリの重複を避けたいという問題があります。現時点ではこれを行っています(エントリが存在しないかどうかを確認した後にのみドキュメントを挿入します):

from pymongo import Connection 
import pandas as pd
from time import strftime
from collections import OrderedDict

connection = Connection()
db = connection.mydb 
collection = db.mycollection

data = pd.read_csv("data/myfile.csv", parse_dates=[2,5])

for i in range(len(data)):
    if(collection.find({ "id":     data.ix[0],                         \
                         "date1":  data.ix[i, 2].strftime("%Y-%m-%d"), \
                         "date2":  data.ix[i, 5].strftime("%Y-%m-%d"), \
                         "number": int(data.ix[i, 6]),                 \
                         "type":   data.ix[i, 7]}).count() == 0):
        collection.insert(here goes what I'd like to insert)

find()これは問題なく動作しますが、毎回実行すると大幅に速度が低下するように見えるため、これにはすでに重大なパフォーマンスの問題があります (わずか 100Mb のデータ) 。

物事をスピードアップする方法はありますか?多分私はそれを根本的に間違っていますか?すべてではなく、特定のフィールド セットでのみ重複を避ける必要があります (つまり、「number2」もありますが、これは異なる可能性がありますが、他のすべてのフィールドが一致する場合は重複したいと考えています)。

4

3 に答える 3

4

検索しているフィールドに一意のインデックスを作成できます (mongo シェル構文)。

db.mycollection.ensureIndex({_id:1, date1:1, date2:1, number:1, type:1}, {unique: true});

また、重複が挿入されたときに、制約違反の例外をキャプチャします (必要に応じて無視します)。

通常、重複チェックはインデックス ルックアップによって行われるため、これによりパフォーマンスが向上します。

于 2013-06-03T03:52:12.317 に答える
1

挿入する前にチェックすることは、それを防ぐ良い方法ではありません。キーの重複を防ぐには、主キーを使用します。mongodb で主キーを設定する方法を参照してください

また、それがあなたにとって良くない場合は、少なくともmongo indexを追加してください

これを解決する最善の方法 (私が思うに) は、関連するすべてのフィールドからキーを生成し、2 つのうちの 1 つを実行することです。

  1. そのキーを確認してください。インデックスになる場合は、より高速になります
  2. このキーを主キーにすると、挿入は失敗します
于 2013-06-03T03:38:43.807 に答える
0

Upsert フラグを使用して update() 操作を実行できます。 Upsert フラグを使用した更新操作 を参照してください。

また、MongoDB には "_id" という名前の ID が既に組み込まれているので、必要に応じて使用できます。以下は、それがどのように見えるかです:

collection.update(
    { "_id": ObjectID(data.ix[0]),
      "date1": data.ix[i, 2].strftime("%Y-%m-%d")
    }, 
    { "_id": ObjectID(data.ix[0]),
      "date1": data.ix[i, 2].strftime("%Y-%m-%d")
    },
    True
    )
于 2013-06-03T03:52:45.873 に答える