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"}]}
MongoDB的紅寶石原子添加劑更新問題
是否有可能把它創建一個不存在的節點?並且如果已經有一個key:value對,則不轉移到數組中?
多了一個:
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方法對於所有可能性來說都是很多開銷/工作。
紅寶石不印字: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"}
我無法複製上面顯示的第一個案例;你使用的是什麼版本的MongoDB?什麼版本的紅寶石驅動程序? – dcrosta
latest,coll是收集的簡稱,對不起沒有具體。 'coll = Mongo :: Connection.new.db(「test」)'我會盡快查看你的答案,謝謝你的回覆。而輸出也不完全是輸出。我剛剛評論了存儲在數據庫中的內容,而不是來自save/update的輸出,這是最小的。 –
你能顯示你正在使用的確切代碼嗎?另外,你可以通過在mongo shell中執行'db.serverStatus()。version'來找到MongoDB的版本,以及在終端中執行'gem list'的ruby驅動版本。 – dcrosta