gpt4 book ai didi

c# - 在 MongoDB 中安全地插入或更新子文档

转载 作者:可可西里 更新时间:2023-11-01 10:14:35 25 4
gpt4 key购买 nike

我有一个 MongoDB,我在其中记录带有子项数组的项。添加或更新子项时,我首先 FindItem ,然后我添加新的 SubItemSubItems 的数组并替换整个 Item .在我开始批量插入 SubItems 之前,这“很好” .

我认为我的问题是查找和更新不是一个原子操作,结果是我丢失了 SubItems .

我正在使用 .NET MongoDB.Driver,我的保存方法如下所示:

public Task Save(string itemId, SubItem subItem)
{
var itemFilter = Builders<Item>.Filter.Eq(v => v.Id, itemId);
var collection = _db.GetCollection<Item>("Items");

var item = await collection.Find(itemFilter).SingleOrDefaultAsync();

item.SubItems.Add(subItem);
collection.ReplaceOneAsync(itemFilter, item, new UpdateOptions() { IsUpsert = true }).Wait();
return Task.FromResult(0);
}

这是我的数据模型:

public class Item
{
public string Id { get; set; }
public List<SubItem> SubItems { get; set; }
}

public class SubItem
{
public string Id { get; set; }
}

有没有办法插入或更新 SubItem在一次操作中,这样我就可以确保保留整个 Item即使我有多个进程试图同时更新文档,文档也保持一致?

最佳答案

你看过AddToSet了吗?方法,如果你将它与更新函数结合使用而不是替换函数,它应该更好地控制你的原子性。

var updateBuilder = Builders<Item>.Update.AddToSet(items => items.SubItems, new SubItem());

collection.UpdateOne(itemFilter, updateBuilder);

就像你的情况一样。

    public Task Save(string itemId, SubItem subItem)
{
var itemFilter = Builders<Item>.Filter.Eq(v => v.Id, itemId);
var collection = _db.GetCollection<Item>("Items");

var updateBuilder = Builders<Item>.Update.AddToSet(items => items.SubItems, subItem);

collection.UpdateOneAsync(itemFilter, updateBuilder, new UpdateOptions() { IsUpsert = true }).Wait();
}

关于c# - 在 MongoDB 中安全地插入或更新子文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46269453/

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