반응형
업데이트를 사용하여 여러 필드를 어떻게 업데이트합니까?공식 c# 드라이버를 사용하여 MongoDB에서 설정합니까?
다음 코드를 사용하여 이름 = "john" 및 성 = "Doe"인 전자 메일을 업데이트할 수 있습니다.저장() 방법을 사용하지 않고 이메일과 전화를 모두 업데이트하려면 어떻게 해야 합니까?
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);
매우 간단합니다;). 업데이트에 다른 세트 또는 다른 작업을 추가하기만 하면 됩니다.
var update = Update.Set("Email", "jdoe@gmail.com")
.Set("Phone", "4455512");
제네릭 및 type-safe를 사용할 수 있습니다.
var update = Update<Person>.
Set(p => p.Email, "jdoe@gmail.com").
Set(p => p.Phone, "4455512");
조건부 업데이트의 경우 다음과 같은 방법을 사용할 수 있습니다.
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 });
또는 레코드를 팝업한 다음 수정하고 교체합니다.
여러 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);
var _personobj = _person
{
Id = 10, // Object ID
Email="jdoe@gmail.com",
Phone=123456,
};
var replacement = Update<_person>.Replace(_personobj);
collection.Update(myquery, replacement);
문서 필드를 한 번 더 업데이트하려면 다중 플래그를 선택합니다.
예: mongodb 2.0 또는 3.0v:
yourCollection.Update(_filter
, _update
, new MongoUpdateOptions() { Flags = UpdateFlags.Multi })
각 속성을 개별적으로 설정해야 합니다.여러 필드가 있는 개체의 경우 이 확장이 유용할 수 있습니다.
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;
}
변수를 튜플로 전달할 수 있습니다.
public async Task Update(string id, params (Expression<Func<TEntity, dynamic>> field, dynamic value)[] list)
{
var builder = Builders<TEntity>.Filter;
var filter = builder.Eq("_id", id);
var updateBuilder = Builders<TEntity>.Update;
var updates = new List<UpdateDefinition<TEntity>>();
foreach (var item in list)
updates.Add(updateBuilder.Set(item.field, item.value));
var result = await _dbCollection.UpdateOneAsync(filter, updateBuilder.Combine(updates));
}
용도:
await _userRepository.Update(user.id, (x => x.bio, "test"), (x => x.isEmailVerified, false));
언급URL : https://stackoverflow.com/questions/4818964/how-do-you-update-multiple-field-using-update-set-in-mongodb-using-official-c-sh
반응형
'source' 카테고리의 다른 글
Meteor - collection.find()는 항상 모든 필드를 반환합니다. (0) | 2023.05.22 |
---|---|
mongodb에 그래프 저장 (0) | 2023.05.22 |
IHTTPHandler의 용도는 무엇입니까?재사용 가능합니까? (0) | 2023.05.22 |
Bash 셸 스크립트에 입력 인수가 있는지 확인합니다. (0) | 2023.05.22 |
Xcode 'Build and Archive' 메뉴 항목 사용 안 함 (0) | 2023.05.22 |