2012-05-03 11 views
1

でネストされたリスト内の単一の要素を更新し、私は複数のラウンドで簡単なゲームを持っていると私は、最新のラウンドを更新する:公式C#MongoDBのドライバ

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と同等のものを行うことができます公式のMongoDB C#のドライバ?

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

+0

これを原子的にやりたいのですか、ドキュメントを取り戻して変更してから変更を送信しても構いませんか? –

+0

私は変更を送信したいと思います。ラウンドの複数の部分を同時に編集することができます。 –

答えて

4

あなたは、私はあなたがこれを行うことができたとし、LINQのサポートとドライバを使用している場合:

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

私はそれがハンドコーディングUPDATE文ほど効率的ではないであろうと想像するが、これはありません機能的には、ほとんどの場合、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); 

がとてもきれい見ていない、しかし、あなたはケースにモンゴで数によって配列のインデックスを、逃すたいことができるようにサブセットの更新を行います更新する前に新しいラウンドがゲームに追加されました。

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

私はあなたがこれが役に立つことを願っ:

+0

私は実際にLINQを使用していません。また、自分の編集ごとに、Aフィールドを更新して、文書全体を保存しないようにしたいのですが、Roundの他のいくつかのフィールドがAと同時に更新される可能性があります。 –

+0

私の答えはLINQなしで行い、更新を使用しました。 –

+0

ああ、私は各ラウンドにもObjectIdが必要ですか? –

-1

あなたはこのような何かを行うことができます。ありがとう。

+0

これは質問に答えません。 Wesleyは、ネストされた子要素を更新する方法を知りたいと考えています。 –

関連する問題