2012-05-25 44 views
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"}]}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"} 
+0

我無法複製上面顯示的第一個案例;你使用的是什麼版本的MongoDB?什麼版本的紅寶石驅動程序? – dcrosta

+0

latest,coll是收集的簡稱,對不起沒有具體。 'coll = Mongo :: Connection.new.db(「test」)'我會盡快查看你的答案,謝謝你的回覆。而輸出也不完全是輸出。我剛剛評論了存儲在數據庫中的內容,而不是來自save/update的輸出,這是最小的。 –

+0

你能顯示你正在使用的確切代碼嗎?另外,你可以通過在mongo shell中執行'db.serverStatus()。version'來找到MongoDB的版本,以及在終端中執行'gem list'的ruby驅動版本。 – dcrosta

回答

0

的MongoDB沒有前置操作,但它確實有兩家運營商,其以原子方式附加到數組:$push(無條件追加到數組)和$addToSet,它僅在數組做n時才添加到數組已經包含正在添加的元素。

+0

這是完美的,在第一季度的任何想法,關於如何設置深層節點? '「$ set」=> {「a.b.c」=>「55」}' –