In this tutorial, we show you how to use Java MongoDB API collection.update() to update documents.

Test Data

Assume following data / documents are inserted.

{
	"hosting" : "hostA",
	"type" : "vps",
	"clients" : 1000
},
{
	"hosting" : "hostB",
	"type" : "dedicated server",
	"clients" : 100
},
{
	"hosting" : "hostC",
	"type" : "vps",
	"clients" : 900
}
{ "_id" : { "$oid" : "id"} , "hosting" : "hostA" , "type" : "vps" , "clients" : 1000}
{ "_id" : { "$oid" : "id"} , "hosting" : "hostB" , "type" : "dedicated server" , "clients" : 100}
{ "_id" : { "$oid" : "id"} , "hosting" : "hostC" , "type" : "vps" , "clients" : 900}

1. DBCollection.update() with $set

Find document where hosting = ‘hostB’, and update it’s clients values from 100 to 110.

	BasicDBObject newDocument = new BasicDBObject();
	newDocument.put("clients", 110);
 
	BasicDBObject searchQuery = new BasicDBObject().append("hosting", "hostB");
 
	collection.update(searchQuery, newDocument);

Output

{ "_id" : { "$oid" : "id"} , "hosting" : "hostA" , "type" : "vps" , "clients" : 1000}
{ "_id" : { "$oid" : "id"} , "clients" : 110}
{ "_id" : { "$oid" : "id"} , "hosting" : "hostC" , "type" : "vps" , "clients" : 900}
The document is replaced!?
Wait, the entire “hostB” document is replaced with another new document, this is not what we want.

To update a particular value only, uses $set update modifier.

	BasicDBObject newDocument = new BasicDBObject();
	newDocument.append("$set", new BasicDBObject().append("clients", 110));
 
	BasicDBObject searchQuery = new BasicDBObject().append("hosting", "hostB");
 
	collection.update(searchQuery, newDocument);

Output

{ "_id" : { "$oid" : "id"} , "hosting" : "hostA" , "type" : "vps" , "clients" : 1000}
{ "_id" : { "$oid" : "id"} , "hosting" : "hostB" , "type" : "dedicated server" , "clients" : 110}
{ "_id" : { "$oid" : "id"} , "hosting" : "hostC" , "type" : "vps" , "clients" : 900}
Note
The MongoDB team should create another new API named DBCollection.replace(), many beginners are trapped in this DBCollection.update() API and replace the entire document accidentally. Again, to update a particular value, use $set.

2. DBCollection.update() with $inc

This example show the use of $inc modifier to increase a particular value. Find document where hosting = ‘hostB’, update it’s ‘clients’ value by increasing the value from 100 to 199, (100 + 99) = 199.

	BasicDBObject newDocument = 
		new BasicDBObject().append("$inc", 
		new BasicDBObject().append("total clients", 99));
 
	collection.update(new BasicDBObject().append("hosting", "hostB"), newDocument);

Output

{ "_id" : { "$oid" : "id"} , "hosting" : "hostA" , "type" : "vps" , "clients" : 1000}
{ "_id" : { "$oid" : "id"} , "hosting" : "hostB" , "type" : "dedicated server" , "clients" : 199}
{ "_id" : { "$oid" : "id"} , "hosting" : "hostC" , "type" : "vps" , "clients" : 900}

3. DBCollection.update() with multi

This example show the use of multi parameter to update a set of matched documents. Find document where type = ‘vps’, update all the matched documents’ ‘clients’ value to 888.

	BasicDBObject updateQuery = new BasicDBObject();
	updateQuery.append("$set", 
		new BasicDBObject().append("clients", "888"));
 
	BasicDBObject searchQuery = new BasicDBObject();
	searchQuery.append("type", "vps");
 
	collection.updateMulti(searchQuery, updateQuery);			
 
	//below statement set multi to true.
	//collection.update(searchQuery, updateQuery, false, true);

Output

{ "_id" : { "$oid" : "id"} , "hosting" : "hostA" , "clients" : "888" , "type" : "vps"}
{ "_id" : { "$oid" : "id"} , "hosting" : "hostB" , "type" : "dedicated server" , "clients" : 100}
{ "_id" : { "$oid" : "id"} , "hosting" : "hostC" , "clients" : "888" , "type" : "vps"}
Note
If update without the multi set to true.

	BasicDBObject updateQuery = new BasicDBObject();
	updateQuery.append("$set", 
		new BasicDBObject().append("clients", "888"));
 
	BasicDBObject searchQuery = new BasicDBObject();
	searchQuery.append("type", "vps");
 
	collection.update(searchQuery, updateQuery);

You will noticed that only the first matched document is updated.

{"_id":{ "$oid" : "x"} , "hosting" : "hostA" , "clients" : "888" , "type" : "vps"}
{"_id":{ "$oid" : "x"} , "hosting" : "hostB" , "type" : "dedicated server" , "clients" : 100}
{"_id":{ "$oid" : "x"} , "hosting" : "hostC" , "type" : "vps" , "clients" : 900}

To update a set of matched documents, you need to set “multi” to true.

4. Full Example

Full example by combining above code snippets.

package com.mkyong.core;
 
import java.net.UnknownHostException;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.Mongo;
import com.mongodb.MongoException;
 
/**
 * Java MongoDB update document
 * 
 * @author mkyong
 * 
 */
 
public class UpdateApp {
 
	public static void printAllDocuments(DBCollection collection) {
		DBCursor cursor = collection.find();
		while (cursor.hasNext()) {
			System.out.println(cursor.next());
		}
	}
 
	public static void removeAllDocuments(DBCollection collection) {
		collection.remove(new BasicDBObject());
	}
 
	public static void insertDummyDocuments(DBCollection collection) {
		BasicDBObject document = new BasicDBObject();
		document.put("hosting", "hostA");
		document.put("type", "vps");
		document.put("clients", 1000);
 
		BasicDBObject document2 = new BasicDBObject();
		document2.put("hosting", "hostB");
		document2.put("type", "dedicated server");
		document2.put("clients", 100);
 
		BasicDBObject document3 = new BasicDBObject();
		document3.put("hosting", "hostC");
		document3.put("type", "vps");
		document3.put("clients", 900);
 
		collection.insert(document);
		collection.insert(document2);
		collection.insert(document3);
	}
 
	public static void main(String[] args) {
 
	try {
 
	  Mongo mongo = new Mongo("localhost", 27017);
	  DB db = mongo.getDB("yourdb");
 
	  // get a single collection
	  DBCollection collection = db.getCollection("dummyColl");
 
	  System.out.println("Testing 1...no $set");
 
	  insertDummyDocuments(collection);
 
	  // find hosting = hostB, and update the clients to 110
	  BasicDBObject newDocument = new BasicDBObject();
	  newDocument.put("clients", 110);
 
	  BasicDBObject searchQuery = new BasicDBObject().append("hosting", "hostB");
 
	  collection.update(searchQuery, newDocument);
 
	  printAllDocuments(collection);
	  removeAllDocuments(collection);
 
	  System.out.println("\nTesting 1...with $set");
 
	  insertDummyDocuments(collection);
 
	  BasicDBObject updateDocument = new BasicDBObject();
	  updateDocument.append("$set", new BasicDBObject().append("clients", 110));
 
	  BasicDBObject searchQuery2 = new BasicDBObject().append("hosting", "hostB");
 
	  collection.update(searchQuery2, updateDocument);
 
	  printAllDocuments(collection);
	  removeAllDocuments(collection);
 
	  System.out.println("\nTesting 2... with $inc");
	  insertDummyDocuments(collection);
	  // find hosting = hostB and increase it's "clients" value by 99
	  BasicDBObject newDocument2 = new BasicDBObject().append("$inc",
		new BasicDBObject().append("clients", 99));
 
	  collection.update(new BasicDBObject().append("hosting", "hostB"), newDocument2);
 
	  printAllDocuments(collection);
	  removeAllDocuments(collection);
 
	  System.out.println("\nTesting 3... with $multi");
 
	  insertDummyDocuments(collection);
	  // find type = vps , update all matched documents , clients value to 888
	  BasicDBObject updateQuery = new BasicDBObject();
	  updateQuery.append("$set", new BasicDBObject().append("clients", "888"));
 
	  BasicDBObject searchQuery3 = new BasicDBObject();
	  searchQuery3.append("type", "vps");
 
	  collection.updateMulti(searchQuery3, updateQuery);
	  // collection.update(searchQuery3, updateQuery, false, true);
 
	  printAllDocuments(collection);
	  removeAllDocuments(collection);
 
	  System.out.println("Done");
 
	} catch (UnknownHostException e) {
		e.printStackTrace();
	} catch (MongoException e) {
		e.printStackTrace();
	}
 
    }
}

Output

Testing 1...no $set
{ "_id" : { "$oid" : "id"} , "hosting" : "hostA" , "type" : "vps" , "clients" : 1000}
{ "_id" : { "$oid" : "id"} , "clients" : 110}
{ "_id" : { "$oid" : "id"} , "hosting" : "hostC" , "type" : "vps" , "clients" : 900}
 
Testing 1...with $set
{ "_id" : { "$oid" : "id"} , "hosting" : "hostA" , "type" : "vps" , "clients" : 1000}
{ "_id" : { "$oid" : "id"} , "hosting" : "hostB" , "type" : "dedicated server" , "clients" : 110}
{ "_id" : { "$oid" : "id"} , "hosting" : "hostC" , "type" : "vps" , "clients" : 900}
 
Testing 2... with $inc
{ "_id" : { "$oid" : "id"} , "hosting" : "hostA" , "type" : "vps" , "clients" : 1000}
{ "_id" : { "$oid" : "id"} , "hosting" : "hostB" , "type" : "dedicated server" , "clients" : 199}
{ "_id" : { "$oid" : "id"} , "hosting" : "hostC" , "type" : "vps" , "clients" : 900}
 
Testing 3... with $multi
{ "_id" : { "$oid" : "id"} , "hosting" : "hostB" , "type" : "dedicated server" , "clients" : 100}
{ "_id" : { "$oid" : "id"} , "hosting" : "hostC" , "type" : "vps" , "clients" : 900}
{ "_id" : { "$oid" : "id"} , "clients" : "888" , "hosting" : "hostA" , "type" : "vps"}
Done

References

  1. How to do updating in MongoDB
  2. $set update modifier
  3. $inc update modifier
  4. Java MongoDB APIs , DBCollection JavaDoc
Tags :
< PreviousNext >
Java MongoDB : Insert a documentIndexJava MongoDB : Query document
Founder of Mkyong.com and HostingCompass.com, love Java and open source stuff. Follow him on Twitter, or befriend him on Facebook or Google Plus. If you like my tutorials, consider making a donation to this charity, thanks.

Related Posts

Popular Posts