MongoDB 和 Asp 核心仅更新一个键:值对而不是整个模型
MongoDB and Asp Core update only a key: value pair instead of whole model
在我们的应用程序中,我们有一个链接到 mongoDB 数据库的用户模型。我的问题是关于 仅修改给定用户数据 中 key/value 对的一个值(当然使用用户 ID)。
这是我的简单模型:
public class User
{
[BsonId]
public string Id { get; set; }
public string email { get; set; } = string.Empty;
public bool hasAcceptedTerms { get; set; } = false;
public int state { get; set; } = 0;
public int UserId { get; set; } = 0;
public IList<UserFile> SubmittedFiles { get; set; }
}
public class UserFile
{
public int fileID { get; set; }
public bool hasFile { get; set; }
}
在我们的应用程序中,首次对用户进行身份验证后,我们使用
在 Mongo 数据库中创建他的条目
public async Task AddUser(User item)
{
await _context.Users.InsertOneAsync(item);
}
在他第一次登录后,我们想更新他接受条款的事实:这样做我们想将 hasAcceptedTerms
更改为 true
,并将 state
键从 0 移动到 1
.
目前在我们的存储库中,我们有类似的东西:
public async Task<UpdateResult> UpdateUser(string id, User item)
{
return await _context.Users
.ReplaceOneAsync(n => n.Id.Equals(id)
, item
, new UpdateOptions { IsUpsert = true });
}
但这样做我们必须提供与我们的模型相对应的完整项目。
我找不到任何方法来创建我可以像这样使用的函数:
UdateUserData(string id, string data, bool newvalue);
例如调用 UpdateUserData('user1objectidhash', 'hasAcceptedTerms', true)
将修改由其 ObjectID 标识的用户的正确值。
- 第一个问题:输入
data
作为 string
一个好的 idea/unique 解决方案? 我觉得我的函数调用不够优雅通过将数据键作为字符串输入。
- 第二:我不知道新值的类型是什么,因为这取决于我要修改的数据是什么。我可以从模型中检测到它吗?
- 3rd: 我不知道可以处理此更新的正确 Mongo.Driver 函数。
你能给我一些提示和提示吗?
如果你只是想更新不是整个对象,而是一些属性,可以执行此 Update
命令:
collection.UpdateOneAsync(x=>x.Id ==id,
Builders<User>.Update.Set(u=>u.hasAcceptedTerms, false)
.Set(u=>u.state, 1));
我假设,那个集合是你的 IMongoCollection<User>
,你的意思是 _context.Users
在我们的应用程序中,我们有一个链接到 mongoDB 数据库的用户模型。我的问题是关于 仅修改给定用户数据 中 key/value 对的一个值(当然使用用户 ID)。
这是我的简单模型:
public class User
{
[BsonId]
public string Id { get; set; }
public string email { get; set; } = string.Empty;
public bool hasAcceptedTerms { get; set; } = false;
public int state { get; set; } = 0;
public int UserId { get; set; } = 0;
public IList<UserFile> SubmittedFiles { get; set; }
}
public class UserFile
{
public int fileID { get; set; }
public bool hasFile { get; set; }
}
在我们的应用程序中,首次对用户进行身份验证后,我们使用
在 Mongo 数据库中创建他的条目public async Task AddUser(User item)
{
await _context.Users.InsertOneAsync(item);
}
在他第一次登录后,我们想更新他接受条款的事实:这样做我们想将 hasAcceptedTerms
更改为 true
,并将 state
键从 0 移动到 1
.
目前在我们的存储库中,我们有类似的东西:
public async Task<UpdateResult> UpdateUser(string id, User item)
{
return await _context.Users
.ReplaceOneAsync(n => n.Id.Equals(id)
, item
, new UpdateOptions { IsUpsert = true });
}
但这样做我们必须提供与我们的模型相对应的完整项目。
我找不到任何方法来创建我可以像这样使用的函数:
UdateUserData(string id, string data, bool newvalue);
例如调用 UpdateUserData('user1objectidhash', 'hasAcceptedTerms', true)
将修改由其 ObjectID 标识的用户的正确值。
- 第一个问题:输入
data
作为string
一个好的 idea/unique 解决方案? 我觉得我的函数调用不够优雅通过将数据键作为字符串输入。 - 第二:我不知道新值的类型是什么,因为这取决于我要修改的数据是什么。我可以从模型中检测到它吗?
- 3rd: 我不知道可以处理此更新的正确 Mongo.Driver 函数。
你能给我一些提示和提示吗?
如果你只是想更新不是整个对象,而是一些属性,可以执行此 Update
命令:
collection.UpdateOneAsync(x=>x.Id ==id,
Builders<User>.Update.Set(u=>u.hasAcceptedTerms, false)
.Set(u=>u.state, 1));
我假设,那个集合是你的 IMongoCollection<User>
,你的意思是 _context.Users