使用官方C#MongoDB驱动程序更新嵌套列表中的单个元素

时间:2012-05-03 22:55:55

标签: c# mongodb mongodb-query mongodb-.net-driver nosql

我有一个简单的游戏,有多轮,我想更新最近一轮:

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; }
}

如何使用官方MongoDB C#驱动程序执行等效的games.Rounds.Last().A = x

编辑:添加了Round.B。请注意,在这种情况下,A和B都可以同时更新,因此我无法保存整个文档。我只想更新A字段。

2 个答案:

答案 0 :(得分: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中的数字索引到一个数组,所以你会错过在你更新之前在游戏中添加新Round的情况。

答案 1 :(得分:-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);

我希望你觉得这很有用。感谢。