sql >> データベース >  >> NoSQL >> MongoDB

insert_manyを使用して重複キーエラーを安全に無視する方法

    BulkWriteErrorで生成されたエラーを調べることで、これに対処できます。 。これは実際にはいくつかのプロパティを持つ「オブジェクト」です。興味深い部分はdetailsにあります :

    import pymongo
    from bson.json_util import dumps
    from pymongo import MongoClient
    client = MongoClient()
    db = client.test
    
    collection = db.duptest
    
    docs = [{ '_id': 1 }, { '_id': 1 },{ '_id': 2 }]
    
    
    try:
      result = collection.insert_many(docs,ordered=False)
    
    except pymongo.errors.BulkWriteError as e:
      print e.details['writeErrors']
    

    最初の実行時に、これによりe.details['writeErrors']の下にエラーのリストが表示されます。 :

    [
      { 
        'index': 1,
        'code': 11000, 
        'errmsg': u'E11000 duplicate key error collection: test.duptest index: _id_ dup key: { : 1 }', 
        'op': {'_id': 1}
      }
    ]
    

    2回目の実行では、すべてのアイテムが存在したため、3つのエラーが表示されます。

    [
      {
        "index": 0,
        "code": 11000,
        "errmsg": "E11000 duplicate key error collection: test.duptest index: _id_ dup key: { : 1 }", 
        "op": {"_id": 1}
       }, 
       {
         "index": 1,
         "code": 11000,
         "errmsg": "E11000 duplicate key error collection: test.duptest index: _id_ dup key: { : 1 }",
         "op": {"_id": 1}
       },
       {
         "index": 2,
         "code": 11000,
         "errmsg": "E11000 duplicate key error collection: test.duptest index: _id_ dup key: { : 2 }",
         "op": {"_id": 2}
       }
    ]
    

    したがって、必要なのは、"code": 11000のエントリの配列をフィルタリングすることだけです。 そして、何か他のものがそこにあるときにのみ「パニック」になります

    panic = filter(lambda x: x['code'] != 11000, e.details['writeErrors'])
    
    if len(panic) > 0:
      print "really panic"
    

    これにより、重複するキーエラーを無視するためのメカニズムが提供されますが、もちろん実際に問題となるものに注意を払うことができます。



    1. Meteorを介して配列からエントリをプルします

    2. 日付/時刻をmongodbに保存するための最良の方法

    3. SpringRedis-application.propertiesファイルから構成を読み取ります

    4. MongoDBでの大文字と小文字を区別しない並べ替え