既存のレコードの既存フィールドのMongodbで$ incを実行しています。 更新直後にgetLastErrorをチェックします。それは、ほとんどOK動作しますが、時にはそれが返されます:エラーがありませんでしたが、ゼロレコードが更新されます。Mongodbは既存のレコードを更新しません。
{nは、0、 connectionId、107、 errは、ヌル、[OK]を、1.0}
をこれは意味します(n = 0)。 返すと期待されるもの:1レコードが更新されました(n = 1)。 更新の直前に存在するrecord.fieldを確認します。レコードのための他の方法はありません。フィールドは消えます。
これはどのようにすることができますか?
公式のErlangドライバを使用していますが、ドライバの問題ではないようです。
コード:usersテーブルの
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
ご返信ありがとうございます。私は更新機能コードサンプルとデータ構造に関するコメントを追加しました。挿入コードは、更新プログラムがDBからレコードを最初に取得するため、重要ではありません。 – Kpoxman
私はあなたを助けたいと思っていますが、あなたのコードに間違いはありません。一方、私が働いている場所ではgetlasterrorは使用しません。私に教えてくれてありがとう。どのくらいの頻度でこのエラーが発生しますか? –