2011-02-09 10 views
24

Y at-il un moyen de modifier la valeur de l'une des clés dans MongoDb via son pilote Java. J'ai essayé le suivant:

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

Mais les deux fonctions remplacent complètement le document interrogé avec le document mis à jour. Quel est le moyen de mettre à jour seulement une valeur d'une clé particulière comme dans le cas de l'utilisation de $ set dans le shell mongo (à part de créer un document complètement nouveau avec tous les champs copiés et l'un des champs mis à jour).

Répondre

19

Je ne suis pas expert en java, mais Semble code suivant correspondent à vos besoins:

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

Regardez aussi this example.

+0

Quelle est la deuxième déclaration pour? Et il semble qu'il n'y ait pas de fonction appelée append dans la classe com.mongodb.DBCollection. Mais cela fonctionne bien sans la deuxième déclaration. Merci –

+0

Deuxième déclaration montre que vous pouvez ajouter autant de «set» que vous le souhaitez en mise à jour unique. C'était mon erreur, au lieu de someCollection.append devrait être set.append, j'ai mis à jour ma réponse. –

+3

Salut, cette réponse n'est pas correcte, elle ne définira que la dernière valeur. Voir la réponse que j'ai posté ci-dessous –

1

La réponse précédente m'a indiqué dans la bonne direction, mais le code pour ajouter un 2ème objet à la mise à jour n'a pas fonctionné pour moi. Ce qui suit fait:

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

Cela devrait fonctionner, la réponse qui est acceptée est pas juste au-dessus.

+3

de Yekmer's La réponse d'Andrew Orsich est FAUX! Celui-ci fonctionne. – astonia

+0

Que se passe-t-il si "requête" est imbriquée? –

0

Aucune des solutions mentionnées ci-dessus n'a fonctionné pour moi. Je compris que la requête doit être un type de document et non un BasicDBObject:

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

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

Où "yourMongoCollection" est de type "MongoCollection" et "objectId" de type "objectId"

0

En premier lieu, à moins que je veux pour reconfigurer/reformater/"re-taper" mes valeurs je voudrais aller seulement avec findAndModify et pasupdate.

Voici un exemple entièrement pour c & fins de p ... Enjoy:

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); 
    } 
Questions connexes