Java MongoDB更新

本文介绍如何使用collection.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. 使用$set更新文档

查询hosting = 'hostB'的文档并把clients的值从100更新为10

使用$set只更新特定的字段。

Document updateDocument = new Document();
updateDocument.append("$set", new Document().append("clients", 110));

Document searchQuery2 = new Document().append("hosting", "hostB");

collection.updateOne(searchQuery2, updateDocument);

输出:

{ "_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}

2. 使用$inc更新文档

该例子介绍使用$inc修改符增加特定值。

查询hosting = 'hostB'的文档,并把'clients'的值从100增加到199。

Document newDocument2 = new Document().append("$inc",
        new Document().append("clients", 99));

collection.updateOne(new Document().append("hosting", "hostB"), newDocument2);

输出:

{ "_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. 使用updateMany更新多个文档

该例子介绍使用updateMany更新符合条件的多个文档。

查询type = 'vps'的文档,并把所有符合条件的文档的clients更新为888。

Document updateQuery = new Document();
updateQuery.append("$set", new Document().append("clients", "888"));

Document searchQuery3 = new Document();
searchQuery3.append("type", "vps");

collection.updateMany(searchQuery3, updateQuery);

输出:

{ "_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"}

4. 完整实例

import com.mongodb.MongoClient;
import com.mongodb.MongoException;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;

public class UpdateDocument {
    public static void printAllDocuments(MongoCollection<Document> collection) {
        FindIterable<Document> documents = collection.find();
        MongoCursor<Document> mongoCursor = documents.iterator();
        while (mongoCursor.hasNext()) {
            System.out.println(mongoCursor.next());
        }
    }

    public static void removeAllDocuments(MongoCollection<Document> collection) {
        collection.deleteMany(new Document());
    }

    public static void insertDummyDocuments(MongoCollection<Document> collection) {
        Document document = new Document();
        document.put("hosting", "hostA");
        document.put("type", "vps");
        document.put("clients", 1000);

        Document document2 = new Document();
        document2.put("hosting", "hostB");
        document2.put("type", "dedicated server");
        document2.put("clients", 100);

        Document document3 = new Document();
        document3.put("hosting", "hostC");
        document3.put("type", "vps");
        document3.put("clients", 900);

        collection.insertOne(document);
        collection.insertOne(document2);
        collection.insertOne(document3);
    }

    public static void main(String[] args) {

        try {

            MongoClient mongoClient = new MongoClient("localhost", 27017);
            MongoDatabase database = mongoClient.getDatabase("test");

            // get a single collection
            MongoCollection<Document> collection = database.getCollection("dummyColl");

            System.out.println("\nTesting 1...with $set");

            insertDummyDocuments(collection);

            Document updateDocument = new Document();
            updateDocument.append("$set", new Document().append("clients", 110));

            Document searchQuery2 = new Document().append("hosting", "hostB");

            collection.updateOne(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
            Document newDocument2 = new Document().append("$inc",
                    new Document().append("clients", 99));

            collection.updateOne(new Document().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
            Document updateQuery = new Document();
            updateQuery.append("$set", new Document().append("clients", "888"));

            Document searchQuery3 = new Document();
            searchQuery3.append("type", "vps");

            collection.updateMany(searchQuery3, updateQuery);
            // collection.update(searchQuery3, updateQuery, false, true);

            printAllDocuments(collection);
            removeAllDocuments(collection);

            System.out.println("Done");

        } catch (MongoException e) {
            e.printStackTrace();
        }

    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,860评论 18 139
  • 个人学习批处理的初衷来源于实际工作;在某个迭代版本有个BS(安卓手游模拟器)大需求,从而在测试过程中就重复涉及到...
    Luckykailiu阅读 4,760评论 0 11
  • 又到一年尾声,好像从18岁以后,日子就过的越来越快了! 早几天就想着要在17年末的时候回顾一下这一年发生的事情,今...
    邓邓朝慧阅读 357评论 0 5
  • 哪些花儿,那些花儿,还开着吗?废话,早都谢了,只能说还活着。 老官预购了冯小刚的芳华国庆期间的票,结果那天一早他公...
    三福弗朗西斯阅读 242评论 0 0
  • 今晚五点半就去托辅接孩子,我在路上担心儿子写不完作业呢,到托辅看到儿子已经写完作业,我说:“今天写的很快吗?”...
    雪_fde9阅读 179评论 0 0