gpt4 book ai didi

c# - 在 Mongodb 中更新字典

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

我有一个存储以下数据的类:

public class User
{
public ObjectId _id { get; set; }
public string Name { get; set; }
public string Pass { get; set; }
public Dictionary<string, Tuple<string, string>> Quests { get; set; }
}

新用户用这个实例化:

await collection.InsertOneAsync(new User { Name = u, Pass = p, 
Quests = new Dictionary<string,Tuple<string,string>>() });

我知道如何从创建的文档中查找和提取信息,但我不知道如何推送和保存对文档的更改。大多数在线答案都是针对旧的 Mongodb C# 驱动程序的,所以像 Query.save() 这样的东西不存在,或者我没有包含正确的包进入我的程序。

我希望能够在词典中添加和删除条目,然后将更改保存到文档中。有什么建议吗?

最佳答案

不确定您到底想要什么。 MongoDB 中基本上有两种类型的更新:您可以执行原子更新,或替换文档

替换文档通常更容易,因为它允许您使用标准 C# 操作来执行修改,并且它将重新评估生成的属性等:

var user = new User { Name = "John Doe", Quests = 
new Dictionary<string, Tuple<string, string>> {
{ "hoho", new Tuple<string, string>("A", "A-Item") } } };
users.InsertOneAsync(user).Wait();
user.Quests = new Dictionary<string, Tuple<string, string>> {
{ "hoho Modified", new Tuple<string, string>("B", "B-Item") } };
users.ReplaceOneAsync(p => p.Id == user.Id, user);

但是,有时需要使用原子修饰符,如$push$pull$set$addToSet 等,因为并发问题。我通常认为以这种方式对复杂的嵌入式对象执行复杂的操作是个坏主意,因为对象的一致性(在 ACID 意义上,或“对象不变量”) 无法检查。

假设不应允许用户同时拥有超过 3 个事件任务,谁确保遵守此规则?这通常是代码的责任,复杂的不变量不能被数据库检查。

如果你仍然想使用那些原子运算符,我建议你问一个新问题,因为它真的取决于细节(默认情况下,字典被序列化为文档,元组被序列化为数组,它们需要MongoDB 中不同的原子修饰符)。例如,要向字典中添加一个新项目,请使用 $set:

users.UpdateOneAsync(p => p.Id == user.Id, 
Builders<User>.Update.Set("Quests.hoho Modified",
new Tuple<string, string>("B", "B-Item")));

关于c# - 在 Mongodb 中更新字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29933188/

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