Mongo c#驱动程序UpdateBuilder AddToSet不更新现有项

时间:2015-05-19 08:55:08

标签: c# arrays mongodb upsert

我正在尝试使用UpdateBuilder.AddToSet方法更新BsonDocument中的数组项。但是,该方法始终在更新现有的数组中插入项目的新副本。

这是我的目标:

    public class Document
    {
       [BsonRepresentation(BsonType.ObjectId)]
       public String _id { get; set; }
       [BsonIgnoreIfNull]
       public List<Event> Events { get; set; }
    }

    public class Event
    {
       [BsonRepresentation(BsonType.ObjectId)]
       public String _id { get; set; }
       [BsonIgnoreIfNull]
       public String Title { get; set; }
    }

以下是我尝试根据其_id:

更新数组项的方法
    //tevent is an instance of an existing event, with just the Title changed
    var update = new UpdateBuilder<Document>();
    update.AddToSet<Event>(t => t.Events, tevent);
    var query = Query<Event>.EQ(t => t._id, tevent._id);

    //GetCollection() return the document collection
    var result = GetCollection().Update(query, update, UpdateFlags.Upsert);

如前所述,即使存在具有相同_id的项目,也会将项目添加到数组中。如果已存在于文档数组中,我想使用相同的_id更新项目。

1 个答案:

答案 0 :(得分:0)

您的代码将转换为:{_ id:tevent._id}

我认为你应该使用:     var query = Query.EQ(&#34; Events._id&#34;,tevent._id);

它应该转换为like:{Events._id:tevent._id}

你可以在github上找到C#驱动程序源:https://github.com/mongodb/mongo-csharp-driver/blob/531e7b6f1f38934811fa8eb146def5049df332d9/src/MongoDB.Driver.Legacy/Builders/UpdateBuilder.cs