使用mongodb c#驱动程序对最里面的文档执行部分更新

时间:2014-01-21 05:05:51

标签: c# mongodb

我有一个具有多级嵌套集合的Mongo-DB模型。即。在项目集合中,我有屏幕集合,在屏幕集合中我有按钮集合,标签集合,复选框集合等。样本模型如下,

    {
     "ProjectUId": "sample string 1",
     "ProjectName": "sample string 2",
     "LastUpdate": "2014-01-13T10:46:14.6693626+05:30",
     "Screens": [
      {
      "UId": "sample string 1",
      "Id": "sample string 2",
      "ScreenOrientation": {
      "LandscapeId": "sample string 1",
      "PortraitId": "sample string 2",
      "Buttons": [           
        {
        "BId": "sample string 1",
        "Id": "sample string 2",
        "Name":"sample string 3",
        },
        {
        }
        .
        .
        .
        }

所以我的问题是我发现很难只使用mongo db c#driver更新具有Bid = B0001的按钮集合的Button文档 任何人都能帮助我吗?

2 个答案:

答案 0 :(得分:0)

请检查语法,因为我没有在这里测试Mongo

MongoCollection<BsonDocument> screens;

var query = new QueryDocument {
    //Guessing that Bid is unique. If more "screens" can have the same button add
    // items to this filter
    { "Buttons.Bid", "B0001" }
};

var update = new UpdateDocument {
    //By using positional operator that updates only the array member that match query
    { "$set", new BsonDocument("Buttons.$.Name", "New Sample string") }
};

BsonDocument updatedScreens = screens.Update(query, update);

答案 1 :(得分:0)

我认为你不能这样做,并且它不是C#驱动程序限制,它是MongoDB查询语言的限制。基本上问题是您不能在更新部分中使用“$”,因为您需要多个“$”(由于嵌套的多个级别)。

最简单的解决方案是将整个文档客户端更新并更新内存中的客户端对象,然后将整个文档保存回数据库。

作为优化,您可以构造一个更新语句,仅修改相关的Button字段,如:

var screenIndex = 0; // you would have to determine this value
var buttonIndex = 0; // you would have to determine this value
var buttonName = string.Format("Screens.{0}.Buttons.{1}.Name", screenIndex, buttonIndex);
var query = Query.EQ("ProjectUId", "...");
var update = Update.Set(buttonName, "new name");
var result = collection.Update(query, udpate);

基本上这样做是为了补偿你不能通过计算索引客户端在字段名中使用多个“$”这一事实。