8

これはかなり簡単だと思いましたが、私の値は同じままです (0)。

私がやりたいのは、ユーザーが読んでいないメッセージを受け取ったときに UnreadMessages フィールドをインクリメントし、読んだときにそれをデクリメントすることです。したがって、次のようなコードが機能すると思いました。

var userHelper = new MongoHelper<User>();
//increment
userHelper.Collection.Update(Query.EQ("Id", userId.ToId()), Update.Inc("UnreadMessages", 1));
//decrement
userHelper.Collection.Update(Query.EQ("Id", userId.ToId()), Update.Inc("UnreadMessages", -1));

これらを実行した後、エラーはスローされませんが、値も変更されません。いいえ、上記のコードは解釈される可能性があるため、次々に実行していません:)

アップデート

これが私のヘルパークラスです:

public class MongoHelper<T> : Sandbox.Services.IMongoHelper<T> where T : class
{
    public MongoCollection<T> Collection { get; private set; }

    public MongoHelper()
    {
        var con = new MongoConnectionStringBuilder(ConfigurationManager.ConnectionStrings["MongoDB"].ConnectionString);
        var server = MongoServer.Create(con);
        var db = server.GetDatabase(con.DatabaseName);
        Collection = db.GetCollection<T>(typeof(T).Name.ToLower());
    }
}

そしてTravisの答えのおかげで、私はこれをやってのけることができました:

MongoHelper<UserDocument> userHelper = new MongoHelper<UserDocument>();
            var user = userHelper.Collection.FindAndModify(Query.EQ("Username", "a"), SortBy.Null, Update.Inc("MessageCount", 1), true).GetModifiedDocumentAs<UserDocument>();
4

1 に答える 1

16

あなたのヘルパーが何をするかわからない。ここに私が使用する作業スニペットがあります:

        var query = Query.And(Query.EQ("_id", keyName));
        var sortBy = SortBy.Null;
        var update = Update.Inc("KeyValue", adjustmentAmount);
        var result = collection.FindAndModify(query, sortBy, update, true);

したがって、「クエリ」はドキュメントを検索し、更新はインクリメントを行い、FindAndModify はそれらをまとめて実際にデータベースにアクセスします。

于 2012-05-14T12:16:27.817 に答える