Как обновить несколько полей, используя Update.Set в MongoDB, используя официальный драйвер c #? - PullRequest
40 голосов
/ 27 января 2011

Следующий код позволит мне обновить адрес электронной почты, где 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);

Ответы [ 5 ]

80 голосов
/ 27 января 2011

Это очень просто;), просто добавьте другой набор или еще одну операцию к вашему обновлению:

 var update = Update.Set("Email", "jdoe@gmail.com")
                    .Set("Phone", "4455512");
26 голосов
/ 12 июля 2014

Вы также можете использовать общий и безопасный тип Update<TDocument>:

var update = Update<Person>.
    Set(p => p.Email, "jdoe@gmail.com").
    Set(p => p.Phone, "4455512");
3 голосов
/ 07 ноября 2015
var _personobj = _person
{
    Id = 10, // Object ID
    Email="jdoe@gmail.com",
    Phone=123456,

};
var replacement = Update<_person>.Replace(_personobj);
collection.Update(myquery, replacement);
2 голосов
/ 23 сентября 2018

Для условного обновления вы можете использовать что-то вроде

        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 });

Или просто вынуть запись, затем изменить и заменить ее.

1 голос
/ 21 апреля 2017

, если вы хотите добавить еще одно поле для обновления документа, выберите мульти флаг.

, например, mongodb 2.0 или 3.0v:

yourCollection.Update(_filter
                      , _update
                      , new MongoUpdateOptions() { Flags = UpdateFlags.Multi })  
...