2015-06-17 12 views
6

Sto usando il driver MongoDB .Net nel mio progetto. Voglio aggiornare tutte le proprietà del mio oggetto che è memorizzato in MongoDB. Nella documentazione, l'aggiornamento viene visualizzato in questo modo:Aggiorna tutte le proprietà dell'oggetto in MongoDb

var filter = Builders<BsonDocument>.Filter.Eq("i", 10); 
var update = Builders<BsonDocument>.Update.Set("i", 110); 

await collection.UpdateOneAsync(filter, update); 

Ma io non voglio chiamare il metodo Set per tutte le proprietà, in quanto ci sono molte proprietà e possono essere molti di più in futuro.

Come posso aggiornare l'intero oggetto utilizzando il driver MongoDB .Net?

+0

Yon solo per uso [** '$ set' **] (http://docs.mongodb.org/manual/reference/operator/update/set/) e gli operatori relativi (che è tutti questi builder di driver stanno facendo) sui campi che si desidera aggiornare. Quindi se hai solo bisogno di cambiarne uno allora ne elencherai uno. È questo il tuo problema o vuoi cambiare 20 proprietà su 50 nel tuo aggiornamento? –

+0

@ user3561036 il numero di proprietà aggiornate è sconosciuto, quindi sto bene aggiornando tutte in una volta, anche se il valore è sempre lo stesso. – Sefa

+0

Questo è fondamentalmente un "documento di aggiornamento" senza operatori come '$ set'. Ma c'è un pratico metodo di supporto che fa questo per te piuttosto che serializzare l'intero documento. –

risposta

12

È possibile farlo con ReplaceOneAsync anziché UpdateOneAsync.

È necessario un filtro per abbinare il documento esistente (un filtro con l'id del documento è il più semplice) e il nuovo oggetto.

Hamster hamster = ... 
var replaceOneResult = await collection.ReplaceOneAsync(
    doc => doc.Id == hamster.Id, 
    hamster); 
+1

Ma come posso dare loro gli stessi ID senza prima inviare una richiesta aggiuntiva al database per l'ID già esistente? Mi sto perdendo qualcosa qui? – Reynevan

+0

@Reynevan 1. Puoi ottenere l'id dal db. 2. Puoi creare l'Id da solo nel codice. – i3arnon

+0

Nel mio scenario sto creando oggetti e quindi li aggiungo a un database. Quando avvierò l'app la prossima volta non c'è alcuna garanzia che gli oggetti che crea non siano già lì. Se provo ad aumentarli, non hanno corrispondenza con '_id's. Se ottengo l'id dal DB è una richiesta aggiuntiva al DB. Ho ~ 800 oggetti per lotto. Questo non sembra così efficiente. – Reynevan

-2
var update = new BsonDocument("$set", new BsonDocument(entityType.GetProperties().Where(p => p.Name != "Id").Select(p => new KeyValuePair<string, object>(p.Name, entityType.GetProperty(p.Name).GetValue(task, null))))); 
var options = new UpdateOptions(); 
collection.UpdateOne<MyTask>(item => item.Name == "cheque", update, options); 
+0

Per favore, commenta il tuo codice. Devi spiegare perché la tua risposta è buona. – JorgeHortelano

Problemi correlati