sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur man fortsätter infogningen efter dubblettnyckelfel med PyMongo

Du måste använda insert_many metod och ställ in det beställda alternativet till False .

db_stock.insert_many(<list of documents>)

Som nämnts i den beställda alternativ dokumentation:

beställd (valfritt):Om True (standard) dokument kommer att infogas seriellt på servern, i angiven ordning. Om ett fel uppstår avbryts alla återstående infogningar. Om False, kommer dokument att infogas på servern i godtycklig ordning, eventuellt parallellt, och alla dokumentinfogningar kommer att göras.

Vilket betyder att insättningen kommer att fortsätta även om det finns ett dubblettnyckelfel.

Demo:

>>> c.insert_many([{'_id': 2}, {'_id': 3}])
<pymongo.results.InsertManyResult object at 0x7f5ca669ef30>
>>> list(c.find())
[{'_id': 2}, {'_id': 3}]
>>> try:
...     c.insert_many([{'_id': 2}, {'_id': 3}, {'_id': 4}, {'_id': 5}], ordered=False)
... except pymongo.errors.BulkWriteError:
...     list(c.find())
... 
[{'_id': 2}, {'_id': 3}, {'_id': 4}, {'_id': 5}]

Som du kan se dokument med _id 4, 5 infogades i samlingen.

Det är värt att notera att detta också är möjligt i skalet med hjälp av insertMany metod. Allt du behöver är att ställa in det odokumenterade alternativet ordered till false .

db.collection.insertMany(
    [ 
        { '_id': 2 }, 
        { '_id': 3 },
        { '_id': 4 }, 
        { '_id': 5 }
    ],
    { 'ordered': false }
)


  1. Hur man skapar en konfigurationsfil för MongoDB

  2. Laravel 4 :Anrop till odefinierad metod Redis::connection()

  3. Hur frågar jag refererade objekt i MongoDB?

  4. Varför använder mongoose schema när fördelen med mongodb är att den är schemalös?