2012-01-26 4 views
0

Je veux éviter de faire deux opérations pour atteindre les objectifs suivants:MongoDB tout idiome pour s'effondrer 2 upserts en un seul: créer, modifier-default-set à des valeurs, de modification à la mise à jour-existing document de

  1. Rechercher un document, mettre à jour avec modificateur-1.
  2. Si le document n'existe pas, remplir les champs par défaut avec modificateur-2, puis mettre à jour avec modificateur-1.

C'est un modèle commun, donc cela devrait être possible. En ce moment je dois faire deux upserts. (n'hésitez pas à ajuster le pseudo-code, je suis nouveau dans la langue de la requête). Je suppose que deux opérations entraîneraient deux écritures de disque, je comprends que mongodb écrit des disques asynchrones. Si je ne peux pas le faire en une seule opération, existe-t-il un mécanisme permettant de fusionner les écritures en une seule écriture avant d'écrire sur le journal/disque? Et oui cela ferait une différence significative dans le chargement de mon ensemble de données de 300 Go: D

Répondre

1

Hassan,

asynchrone écrit sur le disque vous avez mentionné sont accomplies par écrit les modifications dans la mémoire, puis les fsync'ing sur le disque périodiquement en arrière-plan, la fusion des deux opérations n'aurait probablement pas d'impact sur la performance autant que vous ne le pensez.

Le journal est une autre affaire entièrement - il est écrit séparément sur le disque d'une manière idempotente pour la sécurité afin de faciliter la récupération/restauration en cas de défaillance ou d'autres problèmes similaires. Vous pouvez toujours démarrer la base de données avec la journalisation désactivée, effectuer l'importation, puis redémarrer avec la journalisation activée une fois que la mise à jour en bloc est terminée si le journal écrit vous cause des problèmes importants. Enfin, faites attention à la logique inexistante dans votre deuxième modificateur - d'un point de vue d'indexation, un opérateur positif tel que les sorties est préférable, sinon les index ne peuvent pas être utilisés et cela ralentira certainement vos insertions.

Loin des encarts en vrac, pour les mises à jour atomiques simples, vous pouvez également explorer l'utilisation de findAndModify (http://www.mongodb.org/display/DOCS/findAndModify+Command) pour effectuer la vérification et les modifications suivantes pour vous, Il est difficile de dire en fonction de la description si ce serait un bon ajustement, car il a ses propres inconvénients.

+0

Je pourrais supprimer le n'existe pas réellement, comme aucun autre thread de contrôle devrait obtenir un état "retourné" retourné. –

Questions connexes