Mongodb не обновляет существующую запись. - PullRequest
1 голос
/ 29 марта 2012

Я делаю $ 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".

Спасибо.

1 Ответ

0 голосов
/ 02 апреля 2012

Я прочитал код драйвера еще раз, более внимательно и обнаружил, что функция mongo: do обеспечивает ту же настройку во время выполнения своего аргумента Fun (соединение, уровень безопасности и т. Д.), Но она не делает обеспечивает эксклюзивный доступ к соединению во время монго: звонить.

Если это правда, то я могу получить getLastError для несвязанных операций.

Пожалуйста, поправьте меня, если я ошибаюсь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...