如何使用官方 c# 驱动程序在 MongoDB 中使用 Update.Set 更新多个字段?
Posted
技术标签:
【中文标题】如何使用官方 c# 驱动程序在 MongoDB 中使用 Update.Set 更新多个字段?【英文标题】:How do you update multiple field using Update.Set in MongoDB using official c# driver? 【发布时间】:2011-01-27 16:26:31 【问题描述】:以下代码将允许我更新 FirstName = "john" 和 LastName = "Doe" 的电子邮件。如何在不使用 Save() 方法的情况下同时更新电子邮件和电话?
MongoDB.Driver.MongoServer _server = MongoDB.Driver.MongoServer.Create("mongodb://localhost");
MongoDB.Driver.MongoDatabase _dataBase = _server.GetDatabase("test");
MongoDB.Driver.MongoCollection<Person> _person = _dataBase.GetCollection<Person>("person");
//Creat new person and insert it into collection
ObjectId newId = ObjectId.GenerateNewId();
Person newPerson = new Person();
newPerson.Id = newId.ToString();
newPerson.FirstName = "John";
newPerson.LastName = "Doe";
newPerson.Email = "john.doe@gmail.com";
newPerson.Phone = "8005551222";
_person.Insert(newPerson);
//Update phone and email for all record with firstname john and lastname doe
MongoDB.Driver.Builders.QueryComplete myQuery = MongoDB.Driver.Builders.Query.And(MongoDB.Driver.Builders.Query.EQ("FirstName", "John"), MongoDB.Driver.Builders.Query.EQ("LastName", "Doe"));
MongoDB.Driver.Builders.UpdateBuilder update = MongoDB.Driver.Builders.Update.Set("Email", "jdoe@gmail.com");
_person.Update(myQuery, update);
【问题讨论】:
【参考方案1】:这很简单;),只需在更新中添加另一个集合或其他操作:
var update = Update.Set("Email", "jdoe@gmail.com")
.Set("Phone", "4455512");
【讨论】:
哇,我从来没想过,除了那个,我几乎什么都试过了!哈哈。谢谢! 如果要更新多个 N 字段,请查看***.com/a/52462098/9429059【参考方案2】:您还可以使用通用和类型安全的Update<TDocument>
:
var update = Update<Person>.
Set(p => p.Email, "jdoe@gmail.com").
Set(p => p.Phone, "4455512");
【讨论】:
【参考方案3】:对于条件更新,您可以使用类似
var updList = new List<UpdateDefinition<MongoLogEntry>>();
var collection = db.GetCollection<MongoLogEntry>(HistoryLogCollectionName);
var upd = Builders<MongoLogEntry>.Update.Set(r => r.Status, status)
.Set(r => r.DateModified, DateTime.Now);
updList.Add(upd);
if (errorDescription != null)
updList.Add(Builders<MongoLogEntry>.Update.Set(r => r.ErrorDescription, errorDescription));
var finalUpd = Builders<MongoLogEntry>.Update.Combine(updList);
collection.UpdateOne(r => r.CadNum == cadNum, finalUpd, new UpdateOptions IsUpsert = true );
或者直接弹出记录,然后修改替换。
【讨论】:
【参考方案4】:我想更新多个 N 个字段,这就是我的实现方式
我用Builders<T>.Update.Combine
// Get the id for which data should be updated
var filter = Builders<BsonDocument>.Filter.Eq("_id", ObjectId.Parse(_id));
// Add Data which we wants to update to the List
var updateDefination = new List<UpdateDefinition<BsonDocument>>();
foreach (var dataField in metaData.Fields)
updateDefination.Add(Builders<BsonDocument>.Update.Set(dataField.Name, dataField.Value));
var combinedUpdate = Builders<BsonDocument>.Update.Combine(updateDefination);
await GetCollectionForClient().UpdateOneAsync(filter, combinedUpdate);
【讨论】:
【参考方案5】:var _personobj = _person
Id = 10, // Object ID
Email="jdoe@gmail.com",
Phone=123456,
;
var replacement = Update<_person>.Replace(_personobj);
collection.Update(myquery, replacement);
【讨论】:
【参考方案6】:如果您想再更新一个文档的字段,请选择多标志。
例如 mongodb 2.0 或 3.0v:
yourCollection.Update(_filter
, _update
, new MongoUpdateOptions() Flags = UpdateFlags.Multi )
【讨论】:
【参考方案7】:您需要单独设置每个属性。 因此,对于具有多个字段的对象,此扩展非常方便:
public static UpdateDefinition<T> ApplyMultiFields<T>(this UpdateDefinitionBuilder<T> builder, T obj)
var properties = obj.GetType().GetProperties();
UpdateDefinition<T> definition = null;
foreach (var property in properties)
if (definition == null)
definition = builder.Set(property.Name, property.GetValue(obj));
else
definition = definition.Set(property.Name, property.GetValue(obj));
return definition;
并被这样称呼:
public async Task<bool> Update(StaffAccount model)
var filter = Builders<StaffAccount>.Filter.Eq(d => d.Email, model.Email);
// var update = Builders<StaffAccount>.Update.Set(d => d, model); // this doesnt work
var update = Builders<StaffAccount>.Update.ApplyMultiFields(model);
var result = await this.GetCollection().UpdateOneAsync(filter, update);
return result.ModifiedCount > 0;
【讨论】:
以上是关于如何使用官方 c# 驱动程序在 MongoDB 中使用 Update.Set 更新多个字段?的主要内容,如果未能解决你的问题,请参考以下文章