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

存在しないノードを作成させることは可能ですか?キーと値のペアがすでに存在する場合は、配列にシフト解除しますか?

もう1つ:

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でwhen:caseメソッドを構築することは、すべての可能性に対して多くのオーバーヘッド/作業になります。

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

::編集::

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

1 に答える 1

0

MongoDBには付加演算子はありませんが、配列にアトミックに付加する2つの演算子があります$push。無条件に配列に付加する演算子と$addToSet、追加する要素がまだ含まれていない場合にのみ配列に付加する演算子です。

于 2012-05-25T14:58:26.683 に答える