2015-05-08 25 views
3

數據庫操作插入現在似乎是在插入後立即返回_id,因此在此處不需要回調。生成(並檢查)_id在哪裏?

問題在於_id在哪裏產生(和檢查),因爲這似乎是一個在miniMongo上完成的快速同步動作,但是沒有完整的_id列表,對miniMongo來說可能如何檢查_id是否重複?

回答

5

在客戶端上使用Collection.insert時,在客戶端上使用random uuid algorithm生成_id,因此客戶端插入表面上看起來是完美的延遲補償。

Collection.insert被實現爲Meteor.method一個特殊的情況下,我們知道,在客戶端模擬在客戶端上運行的同時,相應的服務器操作被觸發,客戶端文件被髮送到服務器連同其本地生成_id

在服務器上,檢查_id是否正確(真正唯一),並且服務器確認回到客戶端的有效插入。

如果客戶端生成的_id畢竟不是唯一的,那麼插入將會失敗並顯示「重複鍵錯誤」(這可能發生爲0.001%的時間 - 可能性更低,您將不得不重新提交你的客戶表單或其他)。

要回答具體的問題,可以在客戶端插入時在瀏覽器中生成_id,但最終會在服務器上檢查其有效性。

編輯:我最初認爲流星試圖從重複鍵錯誤中恢復並生成一個新的密鑰以避免重複並將其傳播到客戶端,我測試了用例並發現我錯了,謝謝@Tom科德伯格指出了這一點。

+2

您是否100%確定該序列?什麼是直接由我自己設置_id:'col.insert({id:'mykey',...});'。這是有效的,在這種情況下,你有一個關鍵的違規錯誤。從我的角度來看,_id始終是由內部Mongo.ObjectID()方法(http://docs.meteor.com/#/full/mongo_object_id)生成的(如果不是上面給出的)。所以我幾乎可以肯定,在指定插入之後或之後,從不會更改_id。如果不合適,總會有錯誤。 –

+0

我可以問你從哪裏得到這些信息,非常感謝你回答這麼快! – Ziac

+0

@Tom:你確實是對的,糾正了我的答案,謝謝! – saimeunt