MongoDB:仅更新特定字段

我试图用C#驱动程序更新(类型)MongoDB集合中的行。 处理MongoCollection类型的特定集合的数据时,我倾向于避免从集合中检索敏感数据(salt,密码哈希等)

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

也许我正在监督MongoDB C#驱动程序中的一些微不足道的工具如何使用MongoCollection.Save(T item)而不更新MongoCollection.Save(T item)等特定属性? 我应该首先检索完整记录,在那里更新“安全”属性,然后将其写回? 或者有一个奇特的选择从更新中排除某些字段?

提前致谢

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.FindAndModify(query,sortby,update); 

方法。

使用FindAndModify,您可以准确指定要更改的现有记录中的哪些字段,并使其余字段保持不变。

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

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

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

 var db = ReferenceTreeDb.Database; var packageCol = db.GetCollection("dotnetpackage"); var filter = Builders.Filter.Where(_ => _.packageName == packageItem.PackageName.ToLower() && _.isLatestVersion); var update = Builders.Update.Set(_ => _.isLatestVersion, false); var options = new FindOneAndUpdateOptions(); packageCol.FindOneAndUpdate(filter, update, options); 

那么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(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; } 

希望这会帮助你:)

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

 Task 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(collectionName).UpdateOneAsync(Builders.Filter.Eq("Id", Id), bson); } 

笔记:

  • 确保所有不必更新的字段都设置为默认值。
  • 如果需要将字段设置为默认值,则需要使用DefaultValueHandling.Include,或者为该更新编写自定义方法
  • 当性能很重要时,使用Builders.Update编写自定义更新方法

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