gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:07:20 26 4
gpt4 key购买 nike

编辑:不寻找这样做的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;
}

最佳答案

我花了一段时间才弄清楚这一点,因为任何官方文档(或其他任何地方)似乎都没有提到它。但是我确实找到了 this在他们的问题跟踪器上,它解释了如何将位置运算符 $ 与 C# 2.0 驱动程序一起使用。

这应该做你想做的:

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

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

[-1].ElementAt(-1) 显然是经过特殊处理的(实际上是所有 < 0),并将被位置运算符 $ 替换.

上面将被翻译成这个查询:

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

关于c# - Mongo 更新数组元素(.NET 驱动程序 2.0),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31453681/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com