2010-10-15 7 views
4

Je veux pousser et tirer des choses d'une pile de manière atomique en utilisant ruby ​​et mongoDB.Comment implémenter une pile atomique avec mongoDB et Ruby

La pression que je peux faire atomiquement par l'exemple de code suivant:

collection.update({"_id" => document["_id"]}, {"$push" => {field_name => value}}) 

code Exemple pop:

value = collection.update({"_id" => document["_id"]}, {"$pop" => {field_name => -1}}) 

Malheureusement, la valeur renvoyée ci-dessus n'est pas la valeur qui a été « sauté » hors la pile.

Cela semble être une fonction/fonctionnalité très utile, et j'ai du mal à croire que ce n'est pas possible avec mongoDB.

Mise à jour

Pour le bénéfice de ceux qui recherchent la réponse complète, il est ici (Merci encore Cameron):

result = collection.find_and_modify({:query => {"_id" => document["_id"]}, :update => {"$pop" => {field_name => -1}}}) 
return result[field_name][0] 

Répondre

5

On dirait que vous voulez que le findandmodify command. Cette commande vous permet de modifier un document de manière atomique et de renvoyer le document qui a été modifié. Notez que par défaut, le document renvoyé est la version avant il a été modifié. Dans ce cas, c'est exactement ce que vous voulez, puisque vous pouvez vous-même récupérer le dernier objet de la pile.

Malheureusement, je ne connais pas le pilote Ruby, mais le documentation devrait vous orienter vers la syntaxe.

+0

C'est un peu compliqué mais ça marche! Merci! –