美文网首页大数据学习
MongoDB:Java操作MongoDB增删改查

MongoDB:Java操作MongoDB增删改查

作者: xiaogp | 来源:发表于2020-08-04 15:13 被阅读0次

摘要:MongoDB

记录Java操作MongoDB的常用操作,包括以下几种场景

  • 查看数据库集合信息
  • 查询操作:findFilterscountDocuments
  • 插入操作:insertOneinsertMany
  • 删除操作:deleteOnedeleteMany
  • 修改操作:updateOneupdateMany
  • 批量操作,有则更新无则插入:bulkWriteReplaceOneModel
  • 单例模式

引入依赖

<dependency>
  <groupId>org.mongodb</groupId>
  <artifactId>mongo-java-driver</artifactId>
  <version>3.8.0</version>
</dependency>

查看MongoDB数据库信息

构造MongoClient对象,指定连接IP和端口,调用listDatabaseNames输出数据库,构造MongoDatabase对象,调用listCollectionNames输出集合名

import com.mongodb.MongoClient;
import com.mongodb.client.MongoDatabase;


public class Main {
    public static void main(String[] args) {
        MongoClient client = new MongoClient("localhost", 27017);
        for (String db : client.listDatabaseNames()) {
            System.out.println(db);
        };

        MongoDatabase db = client.getDatabase("test");
        for (String dbName : db.listCollectionNames()) {
            System.out.println(dbName);
        }
        client.close();
    }
}

查询操作

(1)简单查询

MongoCollection对象调用find方法返回FindIterable结果集,遍历每一个元素get获得对应的key值

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


public class Main {
    public static void main(String[] args) {
        MongoClient client = new MongoClient("localhost");
        MongoDatabase db = client.getDatabase("test");
        MongoCollection<Document> collection = db.getCollection("pira_score");
        FindIterable<Document> documents = collection.find().limit(5);
        for (Document document : documents) {
            System.out.println(document.getInteger("score"));
        }
        client.close();
    }
}
(2)条件查询

在find下加入Filters表达式就可以条件查询,比如Filters.eq

import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import org.bson.Document;


public class Main {
    public static void main(String[] args) {
        MongoClient client = new MongoClient("localhost");
        MongoDatabase db = client.getDatabase("test");
        MongoCollection<Document> collection = db.getCollection("pira_score");
        // Bson转字典
        FindIterable<Document> findIterable = collection.find(Filters.eq( "industry", "M")).limit(5);
        for (Document document: findIterable) {
            System.out.println(document.get("industry") + "," + document.getString("formatted_ent_name"));
        }
    }
}

其他条件查询比如in查询Filters.in

import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import org.bson.Document;


public class Main {
    public static void main(String[] args) {
        MongoClient client = new MongoClient("localhost");
        MongoDatabase db = client.getDatabase("test");
        MongoCollection<Document> collection = db.getCollection("pira_score");
        String[] inArray = new String[] {"C", "M"};
        FindIterable<Document> findIterable = collection.find(Filters.in( "industry", inArray)).limit(5);
        for (Document document: findIterable) {
            System.out.println(document.get("industry") + "," + document.getString("formatted_ent_name"));
        }
    }
}
(3)组合条件查询

多条件组合在find中增加与或非方法,比如Filters.andFilters.or

import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import org.bson.Document;


public class Main {
    public static void main(String[] args) {
        MongoClient client = new MongoClient("localhost");
        MongoDatabase db = client.getDatabase("test");
        MongoCollection<Document> collection = db.getCollection("pira_score");
        FindIterable<Document> document = collection.find(Filters.and(
                Filters.eq("formatted_ent_name", "太仓市瑞弘源商贸有限公司"),
                Filters.eq("inputtime", "2021-01-30")));
        for (Document doc : document) {
            System.out.println(doc.getInteger("score"));
        }
    }
}
(4)其他查询

查询满足过滤条件的数据量,调用集合的countDocuments方法

import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import org.bson.Document;



public class Main {
    public static void main(String[] args) {
        MongoClient client = new MongoClient("localhost");
        MongoDatabase db = client.getDatabase("test");
        MongoCollection<Document> collection = db.getCollection("pira_score");
        long total = collection.countDocuments(Filters.eq("formatted_ent_name", "太仓市瑞弘源商贸有限公司"));
        System.out.println(total);
    }
}

插入操作

插入操作需要实例化Document对象,调用append方法构建key, values,调用集合的insertOne插入Document对象

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


public class Main {
    public static void main(String[] args) {
        MongoClient client = new MongoClient("localhost");
        MongoDatabase db = client.getDatabase("test");
        MongoCollection<Document> collection = db.getCollection("pira_score");
        Document document = new Document()
                .append("_id", "fffffe9735205006bd99776776e32a9b_2021-07-07")
                .append("formatted_ent_name", "一只小狗公司")
                .append("score", 92)
                .append("grade", "等级1")
                .append("rank_industry", 20)
                .append("rank_industry_percent", 13)
                .append("industry", "M")
                .append("inputtime", "2021-07-01");
        collection.insertOne(document);
        client.close();
    }
}

Document对象也可以调用put方法在实例化之后构建数据

public class Main {
    public static void main(String[] args) {
        MongoClient client = new MongoClient("localhost");
        MongoDatabase db = client.getDatabase("test");
        MongoCollection<Document> collection = db.getCollection("pira_score");
        Document document = new Document();
        document.put("_id", "fffffe9735205006bd99776776e32a9b_2021-07-08");
        document.put("formatted_ent_name", "一只小狗公司");
        document.put("score", 92);
        document.put("grade", "等级1");
        document.put("rank_industry", 20);
        document.put("rank_industry_percent", 13);
        document.put("industry", "M");
        document.put("inputtime", "2021-07-01");
        collection.insertOne(document);
        client.close();
    }
}

批次插入使用insertMany,例子如下

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

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.nio.file.*;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) throws IOException {
        MongoClient client = new MongoClient("localhost");
        MongoDatabase db = client.getDatabase("test");
        MongoCollection<Document> collection = db.getCollection("pira_score");
        // 读取txt文件
        List<String> res = Files.lines(Paths.get("src/main/resources/insertManyTest.txt")).collect(Collectors.toList());
        List<Document> list = new ArrayList<>();
        for (String line : res) {
            if (!line.isEmpty()) {
                String[] items = line.split(",");
                list.add(new Document()
                        .append("_id", items[0])
                        .append("formatted_ent_name", items[1])
                        .append("score", Integer.parseInt(items[2]))
                        .append("grade", items[3])
                        .append("rank_industry", Integer.parseInt(items[4]))
                        .append("rank_industry_percent", Integer.parseInt(items[5]))
                        .append("industry", items[6])
                        .append("inputtime", items[7]));
                if (list.size() == 2) {
                    collection.insertMany(list);
                    System.out.println("---------已插入一个批次:2条");
                    list.clear();
                }
            }
        }
        if (!list.isEmpty()) {
            collection.insertMany(list);
            System.out.printf("---------已插入一个批次:%s条", list.size());
            list.clear();
        }
        client.close();
    }
}

删除数据

删除数据调用集合的deleteOnedeleteMany,前者删除一条符合要求的数据,后者对于满足条件的数据全部删除,例子代码先执行deleteOne再deleteMany,符合要求的数据量分别是367->366->0

import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import org.bson.Document;


public class Main {
    public static void main(String[] args) {
        MongoClient client = new MongoClient("localhost");
        MongoDatabase db = client.getDatabase("test");
        MongoCollection<Document> collection = db.getCollection("pira_score");
        System.out.println(collection.countDocuments(Filters.eq("formatted_ent_name", "中国银行股份有限公司济南舜华路支行b")));
        collection.deleteOne(Filters.eq("formatted_ent_name", "中国银行股份有限公司济南舜华路支行b"));
        System.out.println(collection.countDocuments(Filters.eq("formatted_ent_name", "中国银行股份有限公司济南舜华路支行b")));
        collection.deleteMany(Filters.eq("formatted_ent_name", "中国银行股份有限公司济南舜华路支行b"));
        System.out.println(collection.countDocuments(Filters.eq("formatted_ent_name", "中国银行股份有限公司济南舜华路支行b")));
        client.close();
    }
}

修改数据

更新数据调用集合的updateOneupdateMany,前者修改满足过滤条件的1条,后者对于满足条件的数据全部修改,修改需要指定过滤条件和新的文档表达式,需要配置$操作符,比如使用$set修改某个key的值

import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import org.bson.Document;


public class Main {
    public static void main(String[] args) {
        MongoClient client = new MongoClient("localhost");
        MongoDatabase db = client.getDatabase("test");
        MongoCollection<Document> collection = db.getCollection("pira_score");
        collection.updateOne(Filters.eq("formatted_ent_name", "苏州天艺江南文化发展有限公司"),
                new Document("$set", new Document("industry", "E")));
        client.close();
    }
}

把deleteOne改为deleteMany就可以全部修改


批量操作bulkWrite

对集合调用bulkWrite可以进行批量操作,常用的是结合ReplaceOneModel实现批量有则更新,无则插入,实例化ReplaceOneModel并添加到列表中,bulkWrite接受任务列表,例子中文档采用自定义_id,根据_id字段进行判断,有则更新整条文档,无则直接插入

public void batchReplaceApp(List<MyModel> Samples) {
        List<ReplaceOneModel<Document>> list = new ArrayList<>();
        for (MyModel myModel : samples) {
            String entName = myModel.getEntName();
            String entRelName = myModel.getEntRelName();
            String _id = MD5Utils.MD5(entName + "," + entRelName);
            Document replaceDocument = new Document();
            replaceDocument.put("_id", _id);
            replaceDocument.put("entname", entName);
            replaceDocument.put("shortname", entRelName);
            replaceDocument.put("inputtime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
            ReplaceOneModel<Document> replaceOneModel = new ReplaceOneModel<Document>(Filters.eq("_id", _id), replaceDocument);
            list.add(replaceOneModel);
            if (list.size() == 200) {
                mongoCollection.bulkWrite(list);
                LOGGER.info("---------修改mongo全称简称表,已完成{}", list.size());
                list.clear();
            }
        }
        if (!list.isEmpty()) {
            mongoCollection.bulkWrite(list);
            LOGGER.info("---------修改mongo全称简称表,已完成{}", list.size());
            list.clear();
        }
    }

单例模式

import com.mongodb.MongoClient;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.ReplaceOneModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.bson.Document;

import java.util.ArrayList;
import java.util.List;

public class MongoHandler {
    private static MongoHandler instance;
    private static Logger LOGGER = LoggerFactory.getLogger(MongoHandler.class);
    private MongoClient mongoClient;
    private MongoDatabase mongoDatabase;
    private MongoCollection<Document> mongoCollection;

    private MongoHandler() {
        LOGGER.info("实例化Mongo链接对象:{}", "xx.xx.xx.xx");
        mongoClient = new MongoClient("xx.xx.xx.xx");
        mongoDatabase = mongoClient.getDatabase("xx");
        mongoCollection = mongoDatabase.getCollection("xx");
    }

    public static MongoHandler getInstance() {
        if (instance == null) {
            synchronized (MongoHandler.class) {
                if (instance == null) {
                    instance = new MongoHandler();
                }
            }
        }
        return instance;
    }
    
    public void close() {
        if (mongoClient != null) {
            try {
                mongoClient.close();
            } catch (Exception e) {
                LOGGER.info("关闭mongo连接报错");
            }
        }
    }
    
    public void test(String shortName) {
        FindIterable<Document> findIterable = mongoCollection.find(Filters.eq( "shortname", shortName));
        for (Document document: findIterable) {
            System.out.println(document.get("entname"));
            System.out.println(document.get("shortname"));
        }

    }

    public static void main(String[] args) {
        MongoHandler.getInstance().test("广汽本田");
        MongoHandler.getInstance().close();
    }
}

相关文章

  • Java连接操作MongoDB

    1. Java连接MongoDB和基本的增删改查:MongoDB Java | 菜鸟教程 2.MongoDB在ja...

  • 0812 A

    mongodb 增删改查 增: db.createCollection("name", {options:numb...

  • nodejs+mongodb

    nodejs操作 mongodb数据库增删改查 创建node增删改查执行文件

  • mongodb 查询

    安装mongodb的安装配置mongodb的基本操作mongodb的增删改查(CRUD)选修:主从双备权限控制使用...

  • MongoDB:Java操作MongoDB增删改查

    引入依赖 增 (insertOne, insertMany)删 (deleteOne, deleteMany)改 ...

  • Nodejs+Mongodb

    nodejs操作 mongodb数据库增删改查 创建node增删改查执行文件 有闪电

  • mongoDB入门一

    进行CRUD操作之前有必要了解mongoDB的数据模型。 MongoDB增删改查 MongoDB 是一个基于分布式...

  • mongoDB数据库的简单CRUD操作

    mongodb数据库的操作 基本的增删改查 增 增加一条文档:db.sf.insert({ :" "}) 增加多条...

  • mongodb及express框架(0812)

    安装mongodb mongodb增删改查操作 插入数据 查询数据 插入多条数据 切换数据库并进入 test 修改...

  • Mongodb

    mongodb学习 知识要点: mongodb基本结构 库,集合操作 数据(文档)的增 删 改 查 python操...

网友评论

    本文标题:MongoDB:Java操作MongoDB增删改查

    本文链接:https://www.haomeiwen.com/subject/djlwrktx.html