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」 和 「金子」 字段。
謝謝。
您需要提供一些更多的信息,例如您的文檔結構,運行插入文檔的驅動程序代碼,用於更新文檔的驅動程序代碼等,然後才能提供建議。 – marr75 2012-03-29 14:43:07
感謝您的回覆。我已經添加了更新函數代碼示例和有關數據結構的註釋。我想,插入代碼並不重要,因爲更新首先從數據庫中提取記錄。 – Kpoxman 2012-03-30 14:31:23
我很樂意幫助您,但無法找到您的代碼有任何問題。另一方面,我們不在工作地點使用getlasterror。謝謝你教我。你多久會遇到你的錯誤? – 2012-04-02 14:33:16