2013-02-13 41 views
9

Sto cercando di aggiornare una riga in una raccolta MongoDB (tipizzata) con il driver C#. Quando gestisco i dati di quella particolare raccolta di tipo MongoCollection<User>, tendo ad evitare di recuperare dati sensibili dalla raccolta (salt, hash della password, ecc.)MongoDB: aggiornamento solo campi specifici

Ora sto tentando di aggiornare un'istanza User. Tuttavia, in primo luogo non ho mai recuperato dati sensibili, quindi suppongo che questi dati siano default(byte[]) nell'istanza del modello richiamato (per quanto posso dire) prima di applicare le modifiche e inviare i nuovi dati alla raccolta.

Forse sto supervisionando qualcosa di banale nel driver MongoDB C# come posso utilizzare MongoCollection<T>.Save(T item) senza aggiornare proprietà specifiche come User.PasswordHash o User.PasswordSalt? Devo prima recuperare il record completo, aggiornare qui le proprietà "sicure" e scriverlo? O esiste un'opzione di fantasia per escludere determinati campi dall'aggiornamento?

Grazie in anticipo

risposta

16

Save (someValue) è per il caso in cui si desidera il record risultante essere o diventare oggetto completo (someValue) avete passato.

Puoi usare

var query = Query.EQ("_id","123"); 
var sortBy = SortBy.Null; 
var update = Update.Inc("LoginCount",1).Set("LastLogin",DateTime.UtcNow); // some update, you can chain a series of update commands here 

MongoCollection<User>.FindAndModify(query,sortby,update); 
metodo

.

Utilizzando FindAndModify è possibile specificare esattamente quali campi in un record esistente modificare e lasciare il resto da solo.

È possibile visualizzare un esempio here.

L'unica cosa che serve dal record esistente sarebbe il suo _id, i 2 campi segreti non devono essere caricati o mappati nuovamente nell'oggetto POCO.

+1

Grazie per la segnalazione. Ma il mio problema di base esiste ancora: desidero aggiornare tutte le proprietà dal mio digitato 'MongoCollection ' con i valori di un'istanza di 'T', eccetto uno specifico set di campi noto. Qualcosa sulla falsariga di 'Aggiornamento . Ogni cosa di (qualche oggetto). Eccetto (x => x.ExceptThis). Eccetto (x => x.ExceptThat)' – Manny

+2

Questo è un lavoro personalizzato che avresti bisogno di scrivere (EverythingFrom ..) . Non troppo difficile da fare sul lato client, camminando su BsonMemberMap e ottenendo tutti i membri mappati, quindi creando solo un Update.Set() da ciascuno se si conosce il valore modificato. Non è garantito coerente dal momento che il DB potrebbe essere cambiato da quando si legge il record in memoria però. –

2

È possibile aggiungere più criteri nell'istruzione Where. In questo modo:

var db = ReferenceTreeDb.Database; 
var packageCol = db.GetCollection<Package>("dotnetpackage"); 
var filter = Builders<Package>.Filter.Where(_ => _.packageName == packageItem.PackageName.ToLower() && _.isLatestVersion); 
var update = Builders<Package>.Update.Set(_ => _.isLatestVersion, false); 
var options = new FindOneAndUpdateOptions<Package>(); 
packageCol.FindOneAndUpdate(filter, update, options); 
0

Bene ci sono molti modi per aggiornare il valore in mongodb.

Di seguito è uno dei modi più semplici che ho scelto di aggiornare un valore di campo nella raccolta mongodb.

public string UpdateData() 
     {    
      string data = string.Empty; 
      string param= "{$set: { name:'Developerrr New' } }"; 
      string filter= "{ 'name' : 'Developerrr '}"; 
      try 
      { 
       //******get connections values from web.config file***** 
       var connectionString = ConfigurationManager.AppSettings["connectionString"]; 
       var databseName = ConfigurationManager.AppSettings["database"]; 
       var tableName = ConfigurationManager.AppSettings["table"]; 

       //******Connect to mongodb********** 
       var client = new MongoClient(connectionString); 
       var dataBases = client.GetDatabase(databseName); 
       var dataCollection = dataBases.GetCollection<BsonDocument>(tableName);  

       //****** convert filter and updating value to BsonDocument******* 
       BsonDocument filterDoc = BsonDocument.Parse(filter); 
       BsonDocument document = BsonDocument.Parse(param); 

       //********Update value using UpdateOne method***** 
       dataCollection.UpdateOne(filterDoc, document);     
       data = "Success"; 
      } 
      catch (Exception err) 
      { 
       data = "Failed - " + err; 
      } 
      return data;  
     } 

Sperando che questo vi aiuterà :)

Problemi correlati