2011-12-12 51 views
4

更新:這個問題被問及MongoDB 1.8.x和接受的解決方案屬於1.8。但是請注意,Mongo 2.x對錯誤消息進行了更改,以便您可以確定哪些字段會在更新以及插入時生成錯誤(請參閱下面的Kyle和Remon的評論)。MongoDB唯一索引錯誤:如何知道哪個字段產生錯誤?

有沒有一種方法來嘗試蒙戈UPSERT,如果有一個唯一索引衝突,知道哪些領域導致了問題 - 在一個數據庫操作?

例如,假設我有一個customers集合_idname屬性。另外,假設unique index存在name以確保沒有兩個customer文檔具有相同的name

目前,我做數據庫操作執行UPSERT:

  1. 查詢customers,看是否有文件已經與我正要插入/更新的名稱存在。
  2. 如果不存在衝突,請執行upsert。

我希望能夠在單個操作中做到這一點,並且如果出現錯誤,請知道哪個字段導致問題。

如果操作是創建一個新文檔,這是可能的。 Mongo返回錯誤E11000 duplicate key error index: {index name}。這有點破解,但我可以使用正則表達式來解析索引名稱(在我的情況下,其中包含字段名稱)。

但是,當更新文檔時,錯誤消息中沒有關於索引或字段的信息。這只是「E11001 duplicate key on update」。

有沒有其他人有關於聰明的方法來做upserts的建議,並知道哪些字段導致獨特的索引問題,如果有必要?希望避免server-side stored JavaScript functions ...

+1

您正在運行哪個版本的MongoDB?這似乎在2.0.1中得到了修復。 –

+0

它是。我剛剛測試了它,並在upsert中給出了違規索引 –

+0

我正在使用1.8.x,但在2.x中瞭解這一更改非常好。感謝@KyleBanker和@RemonvanVliet! –

回答

3

對於插入,解析錯誤消息是你最好的選擇。不幸的是,對於更新,除了試圖檢查集合中的現有數據之外沒有更好的方法。儘管可以在https://jira.mongodb.org處提升。

+0

已經有一個https://jira.mongodb.org/browse/SERVER-4637 – eagor