编辑:不寻找这样做的javascript方式 . 我正在寻找MongoDB C#2.0驱动程序的方法(我知道它可能不可能;但我希望有人知道解决方案) .
我试图在我的mongodb中更新主文档中数组中嵌入的项的值 .
我正在寻找一种强有力的方式来做到这一点 . 我正在使用Mongodb c# 2.0 driver
我可以通过弹出元素,更新值,然后重新插入来实现 . 这感觉不对劲;因为我正在覆盖可能在此期间写的内容 .
这是我到目前为止尝试但没有运气:
private readonly IMongoCollection<TempAgenda> _collection;
void Main()
{
var collectionName = "Agenda";
var client = new MongoClient("mongodb://localhost:27017");
var db = client.GetDatabase("Test");
_collection = db.GetCollection<TempAgenda>(collectionName);
UpdateItemTitle(1, 1, "hello");
}
public void UpdateItemTitle(string agendaId, string itemId, string title){
var filter = Builders<TempAgenda>.Filter.Eq(x => x.AgendaId, agendaId);
var update = Builders<TempAgenda>.Update.Set(x => x.Items.Single(p => p.Id.Equals(itemId)).Title, title);
var result = _collection.UpdateOneAsync(filter, update).Result;
}
3 回答
我花了一些时间来弄清楚这一点,因为它似乎没有在任何官方文档(或其他任何地方)中提及 . 但是我在他们的问题跟踪器上找到了this,它解释了如何使用位置运算符
$
和C#2.0驱动程序 .这应该做你想要的:
请注意,您的
Item.Single()
子句已更改为Item.Any()
并已移至过滤器定义 .[-1]
或.ElementAt(-1)
显然是专门处理的(实际上一切都是<0)并且将被位置操作符$
替换 .以上内容将被翻译为此查询:
谢谢,这很有帮助 . 我有一个补充,我已经使用上面的数组,推动嵌套数组并从中拉出一个 . 我发现的问题是,如果我有一个int数组(所以不是一个对象,只是一个简单的int数组),PullFilter实际上没有工作 - “无法确定序列化信息”这很奇怪,因为它只是一个数组整数 . 我最终做的是将它作为一个只有一个int参数的对象数组,它们都开始工作了 . 可能是一个错误,或者可能是我缺乏理解 . 无论如何,由于我一直在努力寻找有关使用C#2.0驱动程序推送和推送到嵌套对象数组的信息,我想我应该在这里发布我的发现,因为他们使用上面的语法 .
并且:
更新Document或子数组的正确方法如下: