Я делаю $ inc в Mongodb существующего поля существующей записи.
Я проверяю getLastError сразу после обновления. В основном работает нормально, но иногда возвращает:
{n, 0,
ID соединения, 107,
err, null, ok, 1.0}
Это означает, что ошибки не было, но нулевые записи обновляются (n = 0).
Что я ожидаю, что это вернет: 1 запись обновлена (n = 1).
Я проверяю запись.поля на наличие прямо перед обновлением. И нет другого пути для исчезновения поля записи.
Как это может быть?
Я использую официальный драйвер 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" и "gold".
Спасибо.