2016-05-09 43 views
0

私はmongoDBコレクションに5百万以上のレコードを持っています。それから重複したエントリを削除する必要があります。ここで私が試したコードは、あるmongodbデータベースから重複レコードを削除する方法

 from pymongo import MongoClient 
     conn=MongoClient("mongodb://127.0.0.1:27017") 
     db=conn.test 

     cursor=db.coll.aggregate(
      [ 
       {"$group": {"_id":{"Instrument Name":"$Instrument Name","High":"$High","Low":"$Low","V":"$V","Date":"$Date","Close":"$Close","Open":"$Open"}, "unique_ids": {"$addToSet": "$_id"}, "count": {"$sum": 1}}} 

      ], 
      { 
       'allowDiskUse': 'true' 
      } 

     ) 


     response = [] 
     for doc in cursor: 
      del doc["unique_ids"][0] 
      for id in doc["unique_ids"]: 
       response.append(id) 

     db.coll.remove({"_id": {"$in": response}}) 

しかし、私はallowDiskuseそのせずに小さなデータセット内のコードを実行すると、私は

Traceback (most recent call last): File "delete_duplicate.py", line 12, in 'allowDiskUse': 'true' TypeError: aggregate() takes exactly 2 arguments (3 given)

、のようなエラーを取得しています。このコードを実行しようとすると、重複したエントリを削除しても問題ありません。しかし、大規模なデータを設定しようとすると、allowdiskuseを使用する必要があるようなエラーが発生します。上記のerorを使用しています.MongoDB 3.0バージョンを使用しています。したがって、この問題を解決するために誰かが私を助けてください私のplatform.soでensureIndexは動作しません。

+0

'{allowDiskUse:true}'を試してください。引用符なし –

+0

Pythonドライバでは、すべてのオプションがキーワード引数として渡されます。したがって、 'allowDiskUse = True'を実行する必要があります。また、これは複製を削除する最善の方法ではありません。バルク操作を使用する別のアプローチが本当に必要です。私の[回答を参照してください](http://stackoverflow.com/a/34738547/3100115) – styvane

+0

私もこれらの方法を試してみましたが、それは無効な構文のようなエラーをtrowinngだ – shilpa

答えて

0
cursor = [{ 
    "$group": { 
     "_id": { 
      "Instrument Name": "$Instrument Name", 
      "High": "$High", 
      "Low": "$Low", 
      "V": "$V", 
      "Date": "$Date", 
      "Close": "$Close", 
      "Open": "$Open" 
     }, 
     "unique_ids": { 
      "$addToSet": "$_id" 
     }, 
     "count": { 
      "$sum": 1 
     } 
    } 
}] 

その後

result = coll.aggregate(cursor, allowDiskUse=True) 
0

はまた、あなたはあなたがすべて左があり、データベースから言及した列のすべての重複したエントリを削除します、あなたのデータベースにしたいいくつかのユニークなコラム、ためensure_index()を使用することができます呼び出します別個のエントリですので、スクリプトから行うクエリでは、結果に重複したレコードが表示されることはありません。

関連する問題