Проблемы обновления MongoDB Ruby для атомарной добавки

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

Я ожидал, что последняя строка создаст новый узел: {"_id"=>"test", "1"=>{"2"=>"b"}} или же {"_id"=>"test", "1"=>["a",{"2" => "b"}]}

Можно ли заставить его создать узел, который не существует? и разархивировать в массив, если уже есть пара ключ: значение?

еще один:

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

Можно ли сместить значения в массивы, не перезаписывая их? таким образом делая выше: #=>{"_id"=>"test", "1"=>["a","b"]}

Я говорю об этом, потому что у меня большие массивы, и если я загружаю массив и снимаю его на стороне Ruby, это приводит к снижению производительности.

И в связи с первым вопросом, документы в коллекции имеют различные формы, и создание метода когда: в ruby ​​было бы много затрат / работы для всех возможностей.

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

::редактировать::

$db.serverStatus().version
2.0.2

$gem list
mongo (1.6.2, 1.6.1, 1.5.2)

Точный код:

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"} 

1 ответ

MongoDB не имеет оператора prepend, но у него есть два оператора, которые добавляются к массивам атомарно: $pushкоторый безоговорочно присоединяется к массиву, и $addToSet, который только добавляет к массиву, только если он еще не содержит добавляемый элемент.

Другие вопросы по тегам