【问题标题】:MongoDB and Asp Core update only a key: value pair instead of whole modelMongoDB 和 Asp Core 只更新一个键:值对而不是整个模型
【发布时间】:2017-01-05 19:39:42
【问题描述】:

在我们的应用程序中,我们有一个链接到 mongoDB 数据库的用户模型。我的问题是关于仅修改给定用户数据中键/值对中的值(当然使用用户 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 Id 标识的用户的正确值。

  • 第一个问题:data 输入为string 是一个好主意/独特的解决方案吗?我发现将数据键输入为字符串时我的函数调用并不优雅。李>
  • 第二个:我不知道 newvalue 的类型是什么,因为它取决于我要修改的数据是什么。我可以从模型中检测到它吗?
  • 3rd:我不知道可以处理此更新的正确 Mongo.Driver 函数。

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

【问题讨论】:

标签: c# mongodb asp.net-core mongodb-.net-driver


【解决方案1】:

如果您只想更新的不是整个对象,而是某些属性,可以使用Update 命令:

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

我假设,该集合是您的 IMongoCollection&lt;User&gt; ,您的意思是 _context.Users

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多