Java, MongoDB: Comment mettre à jour chaque objet lors de l'itération d'une vaste collection?
J'ai une collection d'environ 1 million de disques avec plus de 20 champs de chacun. J'ai besoin de mettre à jour entier flag
champ de chaque enregistrement (document) l'affectation au hasard 1 ou 2 de la présente flag
champ.
Comment faire lors de l'itération curseur sur la collection complète? Il ne semble pas être une bonne idée de rechercher deuxième fois pour objet déjà trouvé par MongoDB juste pour être en mesure de le mettre à jour:
DBCursor cursor = coll.find();
try {
while(cursor.hasNext()) {
BasicDBObject obj = (BasicDBObject) cursor.next();
...
coll.update(query,newObj)
}
} finally {
cursor.close();
}
Comment mettre à jour un champ dans chaque document d'une énorme collection de MongoDB avec des valeurs différentes de manière efficace?
Vous pouvez mettre à jour tous les documents (qui correspondent à une condition spécifique) dans une seule requête avec le 'multi' drapeau 'mise à jour' de la commande définie sur true. Vérifiez ceci: stackoverflow.com/questions/4146452/...
Je ne peux pas utiliser
https://stackoverflow.com/questions/4146452/mongodb-what-is-the-fastest-way-to-update-all-records-in-a-collection/50768815#50768815 j'ai répondu là-bas. Espérons que cela aide.
Je ne peux pas utiliser
multi
drapeau parce que j'ai mise à jour de chaque document avec la valeur unique. Ce n'est pas la même chose que la mise à jour de nombreux documents avec une seule et même valeur.https://stackoverflow.com/questions/4146452/mongodb-what-is-the-fastest-way-to-update-all-records-in-a-collection/50768815#50768815 j'ai répondu là-bas. Espérons que cela aide.
OriginalL'auteur Anton Ashanin | 2013-04-12
Vous devez vous connecter pour publier un commentaire.
Votre approche est fondamentalement correcte.
Cependant, je ne le considère pas comme une collection comme "énorme"
Vous pouvez exécuter quelque chose de similaire de la coque:
Selon votre MongoDB version, la configuration et de la charge, ce qui peut prendre entre quelques minutes à plusieurs heures
Si vous souhaitez effectuer cette mise à jour en vrac, de l'utilisation de certaines conditions dans votre requête de document, quelque chose comme
coll.find({"aFiled" : {$gt : minVal}, "aFiled" : {$lt : maxVal}})
Mon rectifié fonction réduit à un seul curseur de la requête, vous ne faites pas de requête supplémentaires par itération. Comme vous pouvez le voir, j'utilise
coll.save(doc)
Cela a des problèmes: voir docs.mongodb.org/manual/faq/developers/...
N'oubliez pas d'ajouter
noCursorTimeout()
si vous travaillez avec une énorme collection! Sinon, la commande expire au bout de 10 minutes (au moins il a fait pour moi). De sorte que le haut de la ligne d'Origine de la réponse devient:coll.find({}).noCursorTimeout().forEach(function (doc) {
OriginalL'auteur Ori Dar
Ma solution à ma propre question, inspiré par @orid :
OriginalL'auteur Anton Ashanin