2012-05-25 9 views
0
coll.save({"_id" => "test", "1" => "a"}) #=> {"_id"=>"test", "1"=>"a"} 
coll.update({"_id" => "test"}, {"$set"=>{"1.2" => "b"}}) #=> {"_id"=>"test", "1"=>"a"} 

atomique j'attendais cette dernière ligne créerait un nouveau nœud: {"_id"=>"test", "1"=>{"2"=>"b"}} ou {"_id"=>"test", "1"=>["a",{"2" => "b"}]}MongoDB Ruby additif mise à jour émet

Est-il possible d'avoir créer un nœud qui n'existe pas? et de se décaler dans un tableau s'il y a déjà une paire clé/valeur?

un plus:

coll.save({"_id" => "test", "1" => ["a"]}) #=> {"_id"=>"test", "1"=>["a"]} 
coll.update({"_id" => "test"}, {"$set"=>{"1" => ["b"]}}) #=> {"_id"=>"test", "1"=>["b"]} 

Est-il possible de valeurs dans des tableaux ses premières fonctions, sans les écraser? Je dis cela parce que j'ai de grands tableaux, et il y a un surcoût de performance si je télécharge le tableau, et je le décale du côté de Ruby. Et avec la première question, les documents de la collection ont une variété de formes, et la construction d'une méthode when: case dans ruby ​​serait beaucoup de frais généraux/travail pour toutes les possibilités.

Ruby unshift: http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-unshift

:: modifier ::

$db.serverStatus().version 
2.0.2 

$gem list 
mongo (1.6.2, 1.6.1, 1.5.2) 

code exact:

require 'pp' 
require 'mongo' 
coll = Mongo::Connection.new.db("test").collection("test") 
coll.save({"_id" => "test", "1" => "a"}) 
pp coll.find_one("_id"=>"test") #=> {"_id"=>"test", "1"=>"a"} 
coll.update({"_id" => "test"}, {"$set"=>{"1.2" => "b"}}) 
#Expect, but does not give: {"_id"=>"test", "1"=>{"2"=>"b"}} 
pp coll.find_one("_id"=>"test") #=> {"_id"=>"test", "1"=>"a"} 
+0

Je suis incapable de reproduire votre premier cas montré ci-dessus; quelle version de MongoDB utilisez-vous? Quelle version du driver ruby? – dcrosta

+0

plus tard, coll est court pour la collecte, désolé de ne pas être spécifique. 'coll = Mongo :: Connection.new.db (" test ")' Je vais vérifier votre réponse bientôt, merci d'avoir répondu. Et la sortie n'est pas exactement la sortie non plus. Je viens de commenter ce qui a été stocké dans la base de données, plutôt que la sortie de sauvegarde/mise à jour, ce qui est minime. –

+0

Pouvez-vous montrer le code exact que vous utilisez? Aussi, vous pouvez trouver la version de MongoDB en faisant 'db.serverStatus(). Version' dans le shell mongo, et la version du pilote ruby ​​en faisant' gem list' dans votre terminal. – dcrosta

Répondre

0

MongoDB ne dispose pas d'un opérateur préfix, mais elle présente deux opérateurs qui ajouter à des tableaux de façon atomique: $push, qui s'ajoute de manière inconditionnelle au tableau, et $addToSet, qui ne s'ajoute à un tableau que s'il le fait n ot contient déjà l'élément ajouté.

+0

Ceci est parfait, toute idée sur le 1er Q, sur la façon de $ définir les noeuds profonds? '" $ set "=> {" a.b.c "=>" 55 "}' –