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 标识的用户的正确值。

你能给我一些提示和提示吗?

如果你只是想更新不是整个对象,而是一些属性,可以执行此 Update 命令:

collection.UpdateOneAsync(x=>x.Id ==id, 
        Builders<User>.Update.Set(u=>u.hasAcceptedTerms, false)
                             .Set(u=>u.state, 1));

我假设,那个集合是你的 IMongoCollection<User> ,你的意思是 _context.Users