1

複数のラウンドがある単純なゲームがあり、最新のラウンドを更新したいと思います。

class Game
{
    public ObjectId Id { get; set; }
    public List<Round> Rounds { get; set; }
}

class Round
{
    public int A { get; set; }
    public int B { get; set; }
}

games.Rounds.Last().A = x公式のMongoDBC#ドライバーを使用するのと同等の方法を実行するにはどうすればよいですか?

編集:Round.Bを追加しました。この場合、AとBの両方が同時に更新される可能性があるため、ドキュメント全体を保存して戻すことはできません。Aフィールドのみを更新したい。

4

2 に答える 2

4

LINQをサポートするドライバーを使用している場合は、次のことができると思います。

var last = collection.AsQueryable<Game>().Last();
last.A = x;
collection.Save(last);

手作業でコーディングされた更新ステートメントほど効率的ではないと思いますが、これはほとんどの場合、JavaScriptのバージョンを機能的に反映しています。

編集:LINQなしで、サブセットの更新を行う

var query = Query.EQ("_id", MongoDB.Bson.BsonValue.Create(games.Id);
var update = Update.Set("Rounds." + games.Rounds.Length - 1 + ".A", MongoDB.Bson.BsonValue.Create(x));

Collection.Update(query, update);

見た目はそれほどきれいではありませんが、Mongoの番号で配列にインデックスを付けることができるため、更新する前に新しいラウンドがゲームに追加された場合を見逃してしまいます。

于 2012-05-03T23:25:26.083 に答える
-1

あなたはこのようなことをすることができます:

var query = Query<Entity>.EQ(e => e.Id, id);
var update = Update<Entity>.Set(e => e.Name, "Harry"); // update modifiers
collection.Update(query, update);

これがお役に立てば幸いです。ありがとう。

于 2014-12-16T12:54:31.830 に答える