13

我正在尝试使用 C# 驱动程序更新(类型化的)MongoDB 集合中的一行。在处理特定类型集合的数据时MongoCollection<User>,我倾向于避免从集合中检索敏感数据(盐、密码哈希等)

现在我正在尝试更新一个User实例。但是,我从来没有真正检索过敏感数据,所以我猜在我应用修改并将新数据提交到集合之前,这些数据将default(byte[])在检索到的模型实例中(据我所知)。

也许我正在监督 MongoDB C# 驱动程序中的一些琐碎事情,我如何在MongoCollection<T>.Save(T item)不更新特定属性的情况下使用User.PasswordHashUser.PasswordSalt?我应该先检索完整记录,更新那里的“安全”属性,然后再写回去吗?或者是否有从更新中排除某些字段的奇特选项?

提前致谢

4

4 回答 4

20

Save(someValue) 适用于您希望结果记录成为或成为您传入的完整对象 (someValue) 的情况。

您可以使用

var query = Query.EQ("_id","123");
var sortBy = SortBy.Null;
var update = Update.Inc("LoginCount",1).Set("LastLogin",DateTime.UtcNow); // some update, you can chain a series of update commands here

MongoCollection<User>.FindAndModify(query,sortby,update); 

方法。

使用 FindAndModify,您可以准确指定现有记录中要更改的字段,而不必理会其余字段。

你可以在这里看到一个例子。

现有记录中唯一需要的是它的 _id,这两个秘密字段不需要加载或映射回您的 POCO 对象。

于 2013-02-16T04:56:12.703 回答
4

可以在 Where 语句中添加更多条件。像这样:

var db = ReferenceTreeDb.Database;
var packageCol = db.GetCollection<Package>("dotnetpackage");
var filter = Builders<Package>.Filter.Where(_ => _.packageName == packageItem.PackageName.ToLower() && _.isLatestVersion);
var update = Builders<Package>.Update.Set(_ => _.isLatestVersion, false);
var options = new FindOneAndUpdateOptions<Package>();
packageCol.FindOneAndUpdate(filter, update, options);
于 2016-06-17T12:51:43.650 回答
3

有同样的问题,因为我想为所有类型使用 1 个通用方法并且不想使用反射创建自己的实现,所以我最终得到了以下通用解决方案(简化为在一个方法中显示所有内容):

Task<bool> Update(string Id, T item)
{
    var serializerSettings = new JsonSerializerSettings()
            {
                NullValueHandling = NullValueHandling.Ignore,
                DefaultValueHandling = DefaultValueHandling.Ignore
            };
    var bson = new BsonDocument() { { "$set", BsonDocument.Parse(JsonConvert.SerializeObject(item, serializerSettings)) } };
    await database.GetCollection<T>(collectionName).UpdateOneAsync(Builders<T>.Filter.Eq("Id", Id), bson);
}

笔记:

  • 确保所有不能更新的字段都设置为默认值。

  • 如果您需要将字段设置为默认值,您需要使用 DefaultValueHandling.Include,或者为该更新编写自定义方法

  • 当性能很重要时,使用编写自定义更新方法Builders<T>.Update

    PS:显然应该由 MongoDB .Net Driver 实现,但是我在文档中的任何地方都找不到它,也许我只是看错了方式。

于 2018-03-25T14:27:05.740 回答
1

那么有很多方法可以更新mongodb.

下面是我选择更新 mongodb 集合中的字段值的最简单方法之一。

public string UpdateData()
        {               
            string data = string.Empty;
            string param= "{$set: { name:'Developerrr New' } }";
            string filter= "{ 'name' : 'Developerrr '}";
            try
            {  
               //******get connections values from web.config file*****
                var connectionString = ConfigurationManager.AppSettings["connectionString"];
                var databseName = ConfigurationManager.AppSettings["database"];
                var tableName = ConfigurationManager.AppSettings["table"];

                //******Connect to mongodb**********
                var client = new MongoClient(connectionString);
                var dataBases = client.GetDatabase(databseName);
                var dataCollection = dataBases.GetCollection<BsonDocument>(tableName);       

                //****** convert filter and updating value to BsonDocument*******
                BsonDocument filterDoc = BsonDocument.Parse(filter);
                BsonDocument document = BsonDocument.Parse(param);

                //********Update value using UpdateOne method*****
                dataCollection.UpdateOne(filterDoc, document);                   
                data = "Success";
            }
            catch (Exception err)
            {
                data = "Failed - " + err;
            }
            return data;    
        }

希望这会帮助你:)

于 2017-04-14T12:35:41.563 回答