Comment faire évoluer et mettre à jour les documents avec PyMongo?
J'ai un simple client de l'installation de MongoDB et PyMongo 2.6.3. L'objectif est d'itérer sur chaque document de la collection collection
et de mise à jour (save
) chaque document dans le processus. L'approche, je suis en utilisant ressemble à peu près comme:
cursor = collection.find({})
index = 0
count = cursor.count()
while index != count:
doc = cursor[index]
print 'updating doc ' + doc['name']
# modify doc ..
collection.save(doc)
index += 1
cursor.close()
Le problème est que save
est apparemment la modification de l'ordre des documents dans le curseur. Par exemple, si ma collection est composé de 3 documents (id
s omis pour plus de clarté):
{
"name": "one"
}
{
"name": "two"
}
{
"name": "three"
}
le programme ci-sorties:
> updating doc one
> updating doc two
> updating doc two
Si, cependant, la ligne de collection.save(doc)
est supprimé, la sortie devient:
> updating doc one
> updating doc two
> updating doc three
Pourquoi est-ce arrivé? Quelle est la bonne façon sécuritaire itérer et mise à jour des documents dans une collection?
- Ce n'est pas une réponse. Mais essayez
1 + 999 is 1000
et `1 + 999 == 1000`. - thx était juste recréer pour des raisons de simplicité, toujours en apprentissage de python :). ok maintenant?
- comment êtes-vous modifier les docs? est
doc['name'] = 'newValue'
assez?
Vous devez vous connecter pour publier un commentaire.
Trouvé la réponse dans MongoDB la documentation:
Mode de capture instantanée est activé sur le curseur, et fait un beau garantie:
Pour activer le mode snapshot avec PyMongo:
comme par PyMongo
find()
la documentation. A confirmé que cela a réglé mon problème.snapshot
était déconseillé dans MongoDB 3.6 et retiré de Mongo DB 4.0. N'ai pas trouvé une solution sanssnapshot
find()
documentation.Instantané fait le travail.
Mais sur pymongo 2.9 et au-delà, la syntaxe est légèrement différente.
ou pour n'importe quelle version,
que par la PyMongo documentations
Je n'arrivais pas à recréer votre situation, mais peut-être que, du haut de ma tête, parce que aller chercher les résultats, comme vous le faites est un par un à partir de la db, vous êtes en réalité la création de plus comme vous allez (sauvegarder, puis aller chercher le prochain).
Vous pouvez essayez de tenir le résultat dans une liste (de cette façon, l'extraction de tous les résultats à la fois - pourrait être lourd, en fonction de votre requête):
Espère que cela aide