2015-05-15 3 views
20

Я сейчас обновляю свой код до MongoDB C# driver 2.0, и у меня возникают проблемы с обновлением кода для обновления документов.MongoDB C# Driver 2.0 - Обновить документ

с использованием старой версии я был в состоянии сделать что-то вроде этого:

MyType myObject; // passed in 
var collection = _database.GetCollection<MyType>("myTypes"); 
var result = collection.Save(myObject); 

Я изо всех сил, чтобы найти способ сделать это в новой версии. Я нашел несколько примеров обновления отдельных полей, как

var filter = Builders<MyType>.Filter.Eq(s => s.Id, id); 
var update = Builders<MyType>.Update.Set(s => s.Description, description); 
var result = await collection.UpdateOneAsync(filter, update); 

Я хотел бы, чтобы обновить все поля, как я делал в старой версии с помощью метода Save.

Любые идеи?

Большое спасибо

ответ

13

Я думаю, что вы ищете ReplaceOneAsync():

MyType myObject; // passed in 
var filter = Builders<MyType>.Filter.Eq(s => s.Id, id); 
var result = await collection.ReplaceOneAsync(filter, myObject) 
+1

Thanks mnemosyn! Я как раз собирался опубликовать свой собственный ответ, поскольку я только что нашел ReplaceOneAsync несколько минут назад. Спасибо, в любом случае, это именно то, что мне нужно! –

+0

Откуда вы получаете значение для «id»? – redwards510

+0

Я думаю, что лучше работать с BsonDocument вместо MyType. Если MyType имеет флаг BsonIgnoreExtraFields, документ будет игнорировать поля, которые не представлены в классе MyType. В методе insert метод будет только вставлять поля, которые существуют в классе, и вы потеряете все другие непредставленные поля. –

20

Чтобы добавить, чтобы mnemosyn ответ, в то время как простой ReplaceOneAsync делает обновление документа оно не эквивалентно SaveSave, как также будет вставлять документ, если он не нашел его для обновления.

Для достижения такого же поведения с ReplaceOneAsync необходимо использовать параметр опции:

MyType myObject; 
var result = await collection.ReplaceOneAsync(
    item => item.Id == id, 
    myObject, 
    new UpdateOptions {IsUpsert = true}); 
+0

Какая версия драйвера у вас? Я пробовал 2.01 и 2.2.2. Там UpdateOptions не допускается. Требуемый тип опции - «FindOneAndReplaceOptions ». Я не знаю, как создать это с помощью параметра IsUpsert. –

+0

@JakobLithner Мой код вызывает 'ReplaceOneAsync'. вы уверены, что не называете «FindOneAndReplaceAsync»? – i3arnon

+0

Аааа, вот и мы !!!! Здесь очень много пятницы. Мне нужно затормозить ... Большое спасибо :) –

0

вы можете использовать LINQ следующим образом: ждут context.collection.ReplaceOneAsync (б => b.Id == пункт .id, пункт);

Смежные вопросы