2013-05-01 53 views
2

我是新來的mongodb,所以強調出來,因爲mongodb的不完整的文檔留給我的試驗和錯誤...可悲的是,我所有的嘗試都沒有工作沒有錯誤,讓我困惑什麼正在發生什麼調試......Mongodb更新與upsert和多語法

我只需要更新數據庫上匹配特定條件的多個記錄,並且爲不存在的記錄創建新條目。我相信我可以通過更新,upsert和multi的單一數據庫訪問來完成。下面是我想出:

dbschema.Person.update({ person_id: { $in: ["734533604" ,"701084015"] } }, { $set: {"scores": 1200} }, { options: { upsert: true, multi: true } }); 

我也嘗試多種組合,甚至是舊版本,如:

dbschema.Person.update({ person_id: { $in: ["734533604" ,"701084015"] } }, { $set: {"scores": 1200} }, { upsert: true }, { multi: true }); 

他們沒有工作......

請幫助我這麼瑣碎的東西......我可以很容易地在SQL中做到這一點,但nosql的東西是如此限制我..謝謝!

編輯:

上找到相同的查詢工作完美:

dbschema.Person.find({ person_id: { $in: ["734533604" ,"701084015"] } }, function (err, results) { 
    console.log('result: ' + results); 
    console.log('error: ' + err); 
    console.log('result length: ' + results.length); 
}); 

編輯:

我期待的「未找到」的記錄被創建,並且找到的記錄是更新。我的邏輯可能有缺陷,現在我非常困惑。我最初一次發現()一條記錄,更改值,併爲每條修改的記錄調用save(),但是當我部署到現場時,響應時間變爲數百倍慢特別是當每個請求中有幾百條記錄需要更新時。

然後我發現find()+ $ in,並且性能得到恢復,甚至比以前更好(當查詢時),但更新仍然令人無法接受地慢。因此,現在我正在尋找方法來更新所有文檔在一個查詢..

我通常做的SQL是使用更新時,CASE THEN ...如:

+0

它不可能 – 2013-05-01 18:02:36

+0

你有幾個問題,一些是語法的但是其他的設計。如果您正在查找2條匹配的記錄,並且沒有找到,您是否期望兩者都被創建?如果找到兩個中的一個,你是否期望更新一個並創建一個? Upsert最多可以創建一條新記錄,這就是爲什麼multi和upsert有時並不合理。 – 2013-05-01 20:10:38

+0

是的,我期待如果沒有找到這兩者,如果找到了,它會被更新,而那些沒有被發現的東西被創建..你是對的,我很困惑,也許我的邏輯是有缺陷的以及..但我會解釋爲什麼我試圖這樣做.. – Zennichimaro 2013-05-02 01:46:28

回答

5

根據不同的標準不能更新多條記錄,並期望「更新插入」要弄清楚你是什​​麼意思。 Upsert標誌可以導致至多插入一個文檔,如果您檢查文檔,您會發現在upsert的情況下更新「複合」標準是沒有意義的。

在你的例子中,插入使用哪兩個fbid值?

我認爲你的情況你可以採取幾種方法(都涉及多個單一的操作)。你可以使用循環中的upsert標誌來更新每個fbid值的更新一次 - 這會像你期望的那樣工作,如果沒有找到fbid,它將創建一個新的文檔。其他方式涉及查詢之前運行更新,但我認爲這些方式可能更容易出現競爭條件。

這裏是一個更新是如何工作的解釋 - 我覺得相當完整:使用UPSERT與$,因爲UPSERT可以同時插入一個PERSONID和將第一和第二值之間的混淆 http://docs.mongodb.org/manual/core/update/#update-operations-with-the-upsert-flag

+1

謝謝,我期待更新或插入$ in中的所有記錄。我不確定這是否是這樣做的,因爲我正試圖優化許多插入/更新,這會消除我的響應時間。你有什麼想法我可以插入/更新很多記錄,並最好將它保存在一個鏡頭中? – Zennichimaro 2013-05-02 02:00:58

+0

如果我理解你的問題,那麼沒有辦法做到這一點。 – 2013-05-02 16:00:38