2012-03-29 39 views
1

我做了$ INC MongoDB中現有記錄的現有域。 我在更新後檢查getLastError。它主要的工作原理確定,但有時它返回:的MongoDB不更新現有record.field

{N,O, 的ConnectionId,107, 犯錯,空,OK,1.0}

這意味着:沒有錯誤,但是零個記錄被更新(N = 0)。 我希望它返回:1的記錄更新(N = 1)。 我更新前右檢查所有腦幹的record.field。並且沒有其他方式讓record.field消失。

這怎麼可能?

我使用Erlang的官方驅動程序,但它似乎並沒有成爲一個驅動程序問題。

代碼:

用戶表的
change_gold_amount(User, GoldDiff) when is_record(User, user) -> 
    {ok, {Document}} = find_one(users, {'_id', User#user.id}), 
    UserGold = bson:lookup(gold, Document, 0), 
    case UserGold + GoldDiff < 0 of 
     true -> 
      {error, not_enough_gold}; 
     false -> 
      {ok, LastErr} = do(fun() -> mongo:modify(users, 
                 {'_id', User#user.id}, 
                 {'$inc', {gold, GoldDiff}}), 
             mongo:command({getlasterror, 1}) 
           end), 
      case bson:lookup(n, LastErr) of 
       {1} -> {ok, User#user{gold=UserGold + GoldDiff}}; 
       _ -> {error, {mongo_error, LastErr}} 
      end 
    end. 

find_one(Collection, Selector) -> 
    do(fun() -> mongo:find_one(Collection, Selector) end). 

do(Fun) -> 
    mongo:do(safe, master, get_connection(), ?DB_NAME, Fun). 

記錄有 「_id」 和 「金子」 字段。

謝謝。

+0

您需要提供一些更多的信息,例如您的文檔結構,運行插入文檔的驅動程序代碼,用於更新文檔的驅動程序代碼等,然後才能提供建議。 – marr75 2012-03-29 14:43:07

+0

感謝您的回覆。我已經添加了更新函數代碼示例和有關數據結構的註釋。我想,插入代碼並不重要,因爲更新首先從數據庫中提取記錄。 – Kpoxman 2012-03-30 14:31:23

+0

我很樂意幫助您,但無法找到您的代碼有任何問題。另一方面,我們不在工作地點使用getlasterror。謝謝你教我。你多久會遇到你的錯誤? – 2012-04-02 14:33:16

回答

0

我讀過的驅動程序代碼再次,更仔細,並且發現了蒙戈:做功能做了有趣的參數(連接,安全級別等)的執行過程中提供相同的設置,但它確實在mongo:do call期間提供獨家連接。

如果這是真的,那麼我可能會得到GetLastError函數爲不相干的操作。

如果我錯了,請糾正我。