Java MongoDB: обновить документ
В этом руководстве мы покажем вам, как использовать Java MongoDB APIcollection.update() для обновления документов.
Тестовые данные
Предположим, что следующие данные / документы вставлены.
{
"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
Найдите документ, где host = «hostB», и обновите значения клиентов с 100 до 110.
BasicDBObject newDocument = new BasicDBObject();
newDocument.put("clients", 110);
BasicDBObject searchQuery = new BasicDBObject().append("hosting", "hostB");
collection.update(searchQuery, newDocument);
Выход
{ "_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!?
Подождите, весь документ hostB заменен другим новым документом, это не то, что мы хотим.
Чтобы обновить только конкретное значение, используется модификатор обновления$set.
BasicDBObject newDocument = new BasicDBObject();
newDocument.append("$set", new BasicDBObject().append("clients", 110));
BasicDBObject searchQuery = new BasicDBObject().append("hosting", "hostB");
collection.update(searchQuery, newDocument);
Выход
{ "_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
Команда MongoDB должна создать еще один новый API с именемDBCollection.replace(), многие новички попадают в этот APIDBCollection.update() и случайно заменяют весь документ. Опять же, чтобы обновить конкретное значение, используйте$set.
2. DBCollection.update() with $inc
В этом примере показано использование модификатора$inc для увеличения определенного значения. Найдите документ, где хостинг = "hostB", обновите его значение "клиентов", увеличив значение со 100 до 199, (100 + 99) = 199.
BasicDBObject newDocument =
new BasicDBObject().append("$inc",
new BasicDBObject().append("total clients", 99));
collection.update(new BasicDBObject().append("hosting", "hostB"), newDocument);
Выход
{ "_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
В этом примере показано использование параметраmulti для обновления набора совпадающих документов. Найдите документ, в котором type = «vps», обновите значение «Клиент» всех совпадающих документов до 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);
Выход
{ "_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
Если для обновления безmulti установлено значение 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);
Вы заметите, что обновляется только первый соответствующий документ.
{"_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}
Чтобы обновить набор совпадающих документов, вам необходимо установить «multi» в значение true.
4. Полный пример
Полный пример, объединяя приведенные выше фрагменты кода.
package com.example.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 example
*
*/
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();
}
}
}
Выход
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