Java MongoDB : Update document

来源:转载


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



分享给朋友:
您可能感兴趣的文章:
随机阅读: