2013-06-21 3 views
0

Je dois insérer un ensemble de documents dans une instance MongoDB distante, dans laquelle certains de ces documents peuvent déjà résider à l'instance, c'est-à-dire avoir le paramètre _id. Je veux que MongoDB ignore ces documents et commette le reste.MongoDB Mise à jour en masse silencieuse

Actuellement, le comportement par défaut de la méthode d'insertion de PyMongo est qu'il renvoie une exception DuplicateError pour chaque document dupliqué rencontré sur le serveur distant. Je veux supprimer ce comportement dans un plus grand feu et oublier le genre de fonctionnalité.

Si quelqu'un sait comment faire cela. Ce sera appréciable.

+0

http://stackoverflow.com/questions/2801008/mongodb-insert-if -non-existe avez-vous regardé ce Q? – WiredPrairie

Répondre

1

Pour les encarts en vrac dans lesquels il peut y avoir des erreurs de clé en double, vous devez définir continue_on_errorflag.

Avec ce drapeau, les insertions continueront même si une erreur est survenue. La dernière erreur sera renvoyé par getLastError - que vous pouvez attraper ou si vous voulez oublier le feu et mettre le write concern à 0.

from pymongo import * 
client = MongoClient() 
coll = client.test.test 
coll.drop() 

# Add a test document 
coll.save({'_id': 1, 'hello': 'world'}) 
print(coll.count()) 

# Without the flag - Boom 
coll.insert([{"_id": 1, "hello": "world"}, 
      {"_id": 2, "Howdy": "Worldy"}]) 
print(coll.count()) 

# With a write concern of 0 - no error but not saved. 
coll.insert([{"_id": 1, "hello": "world"}, 
      {"_id": 2, "Howdy": "Worldy"}], w=0) 
print(coll.count()) 

# Will error but will insert as well 
coll.insert([{"_id": 1, "hello": "world"}, 
      {"_id": 2, "Howdy": "Worldy"}], continue_on_error=True) 
print(coll.count()) 

# With a continue_on_error and write concern of 0 - will only error if theres 
# some socket or network error 
coll.insert([{"_id": 1, "hello": "world"}, 
      {"_id": 2, "Howdy": "Worldy"}, 
      {"_id": 3, "Hi": "World"}], w=0, continue_on_error=True) 
print(coll.count()) 
+0

Merci. Je l'ai compris moi-même aussi. Bon d'avoir un double contrôle. – VaidAbhishek