Mongo更新数组元素(.NET驱动程序2.0)

编辑:不寻找这样做的javascript方式。 我正在寻找MongoDB C#2.0驱动程序的方式(我知道它可能不可能;但我希望有人知道一个解决方案)。

我试图在我的mongodb中更新主文档中数组中嵌入的项的值。

我正在寻找一种强有力的方式来做到这一点。 我正在使用Mongodb c#2.0驱动程序

我可以通过弹出元素,更新值,然后重新插入来实现。 这感觉不对劲; 因为我正在覆盖在此期间可能写的内容。

这是我到目前为止尝试但没有运气:

private readonly IMongoCollection _collection; void Main() { var collectionName = "Agenda"; var client = new MongoClient("mongodb://localhost:27017"); var db = client.GetDatabase("Test"); _collection = db.GetCollection(collectionName); UpdateItemTitle(1, 1, "hello"); } public void UpdateItemTitle(string agendaId, string itemId, string title){ var filter = Builders.Filter.Eq(x => x.AgendaId, agendaId); var update = Builders.Update.Set(x => x.Items.Single(p => p.Id.Equals(itemId)).Title, title); var result = _collection.UpdateOneAsync(filter, update).Result; } 

我花了一些时间来弄清楚这一点,因为它似乎没有在任何官方文档(或其他任何地方)中提及。 然而,我在他们的问题跟踪器上找到了这个 ,它解释了如何使用位置运算符$和C#2.0驱动程序。

这应该做你想要的:

 public void UpdateItemTitle(string agendaId, string itemId, string title){ var filter = Builders.Filter.Where(x => x.AgendaId == agendaId && x.Items.Any(i => i.Id == itemId)); var update = Builders.Update.Set(x => x.Items[-1].Title, title); var result = _collection.UpdateOneAsync(filter, update).Result; } 

请注意,您的Item.Single()子句已更改为Item.Any()并移至filter定义。

[-1].ElementAt(-1)显然是专门处理的(实际上一切都是<0)并将被位置运算符$替换。

以上内容将被翻译为此查询:

 db.Agenda.update({ AgendaId: 1, Items.Id: 1 }, { $set: { Items.$.Title: "hello" } }) 

谢谢,这很有帮助。 我有一个补充,我已经使用上面的数组,推动嵌套数组和拉出一个。 我发现的问题是,如果我有一个int数组(所以不是一个对象,只是一个简单的int数组),PullFilter实际上没有工作 – “无法确定序列化信息”这很奇怪,因为它只是一个数组整数。 我最终做的是将它作为一个只有一个int参数的对象数组,它们都开始工作了。 可能是一个错误,或者可能是我缺乏理解。 无论如何,由于我一直在努力寻找有关使用C#2.0驱动程序推送和推送到嵌套对象数组的信息,我想我应该在这里发布我的发现,因为他们使用上面的语法。

 var filter = Builders.Filter.Where(x => x._id == entity.ParentID && x.NestedArray.Any(i => i._id == entity._id)); var update = Builders.Update.PullFilter(x => x.NestedArray.ElementAt(-1).User, Builders.Filter.Eq(f => f.UserID, userID)); Collection(currentUser).UpdateOneAsync(filter, update); 

并且:

 var filter = Builders.Filter.Where(x => x._id == entity.ParentID && x.NestedArray.Any(i => i._id == entity._id)); var update = Builders.Update.Push(x => x.NestedArray.ElementAt(-1).Users, new User { UserID = userID }); Collection(currentUser).UpdateOneAsync(filter, update); 

更新Document或子数组的正确方法如下:

 var filter = Builders.Filter.Where(x => x.Id == di && x.RemuneracionMensualActual.RemuneracionActIndustrial.Any(s => s.Id == oid)); var update = Builders.Update.Set(x => x.RemuneracionMensualActual.RemuneracionActIndustrial.ElementAt(-1).Ingreso, datos.ActividadIndustrial.Ingreso) .Set(x => x.RemuneracionMensualActual.RemuneracionActIndustrial.ElementAt(-1).RazonSocial, datos.ActividadIndustrial.RazonSocial) .Set(x => x.RemuneracionMensualActual.RemuneracionActIndustrial.ElementAt(-1).TipoNegocio, datos.ActividadIndustrial.TipoNegocio);