MongoDB:只更新特定字段
问题描述:
我想用C#驱动程序更新(类型)MongoDB集合中的一行。在处理MongoCollection<User>
类型的特定集合的数据时,我倾向于避免从集合中检索敏感数据(盐,密码哈希等)。MongoDB:只更新特定字段
现在我试图更新User
实例。但是,我从来没有真正检索到敏感数据,所以我想在检索模型实例(据我所知)中,这个数据应该是default(byte[])
,然后我应用修改并将新数据提交给集合。
也许我在监督MongoDB的C#驱动程序怎么用MongoCollection<T>.Save(T item)
没有更新的具体性能,如User.PasswordHash
或User.PasswordSalt
一些小事?我应该先检索完整记录,更新那里的“安全”属性,然后写回来?还是有一个奇特的选择从更新中排除某些字段?
在此先感谢
答
保存(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,您可以准确指定现有记录中的哪些字段进行更改并将剩下的部分单独留下。
您可以看到一个示例here。
您需要从现有记录中唯一需要的是_id,这两个秘密字段不需要加载或曾经映射回您的POCO对象。
答
可以在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);
答
那么有很多方法可以更新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;
}
希望这将帮助你:)
感谢您指出了这一点。但是我的根本问题仍然存在:我希望更新我的类型'MongoCollection'中的所有属性和'T'实例的值,除了一组特定的已知字段。 'Update .EverythingFrom(someObject).Except(x => x.ExceptThis).Except(x => x.ExceptThat)' –
Manny
2013-02-16 10:28:21
这是您需要编写的一项自定义作业(EverythingFrom ..) 。在客户端不难做到,通过遍历BsonMemberMap并获取所有映射成员,然后只有在知道该值发生更改时才从每个成员创建Update.Set()。它不能保证一致性,因为自从您将记录读入内存之后,数据库可能发生了变化。 – 2013-02-25 16:48:14