2011-02-09 10 views
24

C'è un modo in cui posso modificare il valore di una delle chiavi in ​​MongoDb tramite il suo driver Java. Ho provato quanto segue:

someCollection.update(DBObject query, DBObject update); 
someCollection.findAndModify(DBObject query, DBObject update); 

Ma entrambe le funzioni sostituiscono completamente il documento interrogato con il documento aggiornato. Qual è il modo di aggiornare solo uno dei valori di una particolare chiave, come nel caso in cui si usi $ set nella shell di mongo (oltre a creare un documento completamente nuovo con tutti i campi copiati e uno dei campi aggiornati).

risposta

19

io non sono esperto di Java, ma sembra seguente codice soddisfare le vostre esigenze:

BasicDBObject set = new BasicDBObject("$set", new BasicDBObject("age", 10)); 
set.append("$set", new BasicDBObject("name", "Some Name"); 
someCollection.update(someSearchQuery, set); 

un'occhiata anche a this example.

+0

Qual è la seconda affermazione per? E sembra che non ci sia alcuna funzione chiamata append nella classe com.mongodb.DBCollection. Ma funziona bene senza la seconda affermazione. Grazie –

+0

La seconda affermazione mostra che è possibile aggiungere così tanti "set" come si desidera in un singolo aggiornamento. È stato un mio errore, invece di someCollection.append dovrebbe essere impostato.appendi, ho aggiornato la mia risposta. –

+3

Salve, questa non è la risposta corretta, imposterà solo l'ultimo valore. Vedere la risposta che ho postato sotto –

1

La risposta precedente mi ha indirizzato nella giusta direzione, ma il codice per aggiungere un secondo oggetto all'aggiornamento non ha funzionato per me. Di seguito ha fatto:

BasicDBObject newValues = new BasicDBObject("age", 10); 
newValues.append("name", "Some Name"); 
BasicDBObject set = new BasicDBObject("$set", newValues); 
collection.update(someSearchQuery, set); 
28
BasicDBObject carrier = new BasicDBObject(); 
BasicDBObject query = new BasicDBObject(); 
query.put("YOUR_QUERY_STRING", YOUR_QUERY_VALUE); 

BasicDBObject set = new BasicDBObject("$set", carrier); 
carrier.put("a", 6); 
carrier.put("b", "wx1");   
myColl.updateMany(query, set); 

Questo dovrebbe funzionare, la risposta che è accettata, non è proprio sopra.

+3

Andrew Orsich è SBAGLIATO! Questo funziona. – astonia

+0

Cosa succede se "query" è nidificata? Allora come funziona la serie? –

0

Nessuna delle soluzioni sopra menzionate ha funzionato per me. Mi sono reso conto che la query dovrebbe essere un tipo di documento e non un BasicDBObject:

Document set = new Document("$set", new Document("firstName","newValue")); 

yourMongoCollection.updateOne(new Document("_id",objectId), set); 

Dove "yourMongoCollection" è di tipo "MongoCollection" e "objectId" di tipo "ObjectID"

0

In primo luogo, a meno che non voglio per riconfigurare/riformattare/"riscrivere" i miei valori andrei solo con findAndModify e nonupdate.

Ecco un esempio completamente funzionante per c & scopi p ... Godetevi:

Boolean updateValue(DB db, DBCollection collection, String id, String key, Object newValue) 
    { 
     DBCollection collection = db.getCollection(<collection name>); 

     // Identify your required document (id, key, etc...) 
     DBObject  query  = new BasicDBObject("_ID",<ID or key value>); 
     DBObject  update  = new BasicDBObject("$set", new BasicDBObject(key, newValue)); 

     //These flags will guarantee that you'lls get the updated result 
     DBObject  result  = collection.findAndModify(query, null, null, false, update,true, true); 

     //Just for precaution.... 
     if(result == null) 
      return false; 

     return result.get(key).equals(newValue); 
    } 
Problemi correlati