2015-05-15 11 views
20

Attualmente sto aggiornando il mio codice al driver MongoDB C# 2.0 e sto riscontrando problemi nell'aggiornare il codice per aggiornare i documenti.MongoDB C# Driver 2.0 - Aggiornamento documento

utilizzando la vecchia versione ero in grado di fare qualcosa del genere:

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

Sto lottando per trovare un modo per fare questo nella nuova versione. ho trovato alcuni esempi di aggiornamento singoli campi come

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

vorrei aggiornare tutti i campi come stavo facendo nella vecchia versione con il metodo Save.

Qualche idea?

Grazie mille

risposta

13

Penso che stai cercando ReplaceOneAsync():

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

Grazie mnemosyn! Stavo per pubblicare la mia risposta perché ho trovato ReplaceOneAsync pochi minuti fa. Grazie comunque è esattamente quello di cui avevo bisogno! –

+0

Da dove ottieni il valore di "id"? – redwards510

+0

Penso che sia meglio lavorare con BsonDocument invece che con MyType. Se MyType ha il flag BsonIgnoreExtraFields, il documento ignorerà i campi che non sono rappresentati nella classe MyType. Nel metodo insert, il metodo inserirà solo i campi che esistono in classe e si perderanno tutti gli altri campi non rappresentati. –

20

Per aggiungere alla risposta di mnemosyn, mentre un semplice ReplaceOneAsync fa aggiornare un documento non è equivalente a Save come Save inserirebbe anche il documento se non ne trovasse uno da aggiornare.

per ottenere lo stesso comportamento con ReplaceOneAsync è necessario utilizzare il parametro options:

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

In che versione del driver si trova? Ho provato 2.01 e 2.2.2. Là UpdateOptions non è permesso. Il tipo di opzione richiesto è "FindOneAndReplaceOptions ". Non ho idea di come crearlo con un'impostazione IsUpsert. –

+0

@JakobLithner Il mio codice chiama 'ReplaceOneAsync'. sei sicuro di non chiamare 'FindOneAndReplaceAsync'? – i3arnon

+0

Aaaah, ci siamo !!!! È molto venerdì pomeriggio qui. Ho bisogno di prendere freno ... Grazie mille :) –

0

è possibile utilizzare LINQ come segue: attendono context.collection.ReplaceOneAsync (b => b.Id == voce .ID, voce);