2015-05-15 19 views
20

W tej chwili aktualizuję mój kod do MongoDB C# driver 2.0 i mam problemy z aktualizacją kodu, aby zaktualizować dokumenty.MongoDB C# Driver 2.0 - Zaktualizuj dokument

stosując starą wersję udało mi się zrobić coś takiego:

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

jestem stara się znaleźć sposób, aby to zrobić w nowej wersji. znalazłem kilka przykładów aktualizowania pojedynczych dziedzinach jak

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

Chciałbym zaktualizować wszystkie pola jak robiłem w starej wersji z metodą Zapisz.

Wszelkie pomysły?

Thanks a lot

Odpowiedz

13

myślę szukasz ReplaceOneAsync():

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

Dzięki mnemosyn! Właśnie miałem opublikować własną odpowiedź, ponieważ właśnie znalazłem ReplaceOneAsync kilka minut temu. Dzięki, to jest dokładnie to, czego potrzebowałem! –

+0

Skąd czerpiesz wartość "id"? – redwards510

+0

Myślę, że lepiej jest, jeśli pracujesz z BsonDocument zamiast z MyType. Jeśli MyType ma flagę BsonIgnoreExtraFields, dokument zignoruje pola, które nie są reprezentowane w klasie MyType. W metodzie wstawiania metoda wstawi tylko pola istniejące w klasie i utracisz wszystkie pozostałe niereprezentowane pola. –

20

Aby dodać do mnemosyn na odpowiedź, podczas gdy prosta ReplaceOneAsync robi aktualizację dokumentu nie jest równoznaczne z Save jak Save wstawiłby również dokument, gdyby nie znalazł aktualizacji.

Aby osiągnąć ten sam problem z ReplaceOneAsync trzeba użyć parametru opcji:

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

W jakiej wersji sterownika jesteś? Próbowałem już wersji 2.01 i 2.2.2. Tam UpdateOptions jest niedozwolone. Wymagany typ opcji to "FindOneAndReplaceOptions ". Nie mam pojęcia, jak to zrobić z ustawieniem IsUpsert. –

+0

@JakobLithner Mój kod wywołuje 'ReplaceOneAsync'. czy na pewno nie wywołujesz 'FindOneAndReplaceAsync'? – i3arnon

+0

Aaaach, tam jesteśmy !!!! Jest bardzo dużo piątkowego popołudnia. Muszę zaciągnąć hamulec ... Wielkie dzięki :) –

0

można użyć LINQ w następujący sposób: czekają context.collection.ReplaceOneAsync (b => b.Id == poz .Id, pozycja);