Java-MongoDB-API

0、前置工作

创建Maven工程,导入依赖:

XML 复制代码
<dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongo-java-driver</artifactId>
            <version>3.12.7</version>
        </dependency>

1、连接MongoDB并测试

注意:确保已经启动MongoDB,最好是把MongoDB设置为自启程序。

java 复制代码
//连接MongoDB服务器,自带连接池效果
        MongoClient mongoClient = MongoClients.create("mongodb://127.0.0.1:27017");
        //获取数据库,如果数据库不存在,为该数据库存储数据时自动创建数据库。
        MongoDatabase database = mongoClient.getDatabase("test");
        //获取集合,如果集合不存在,首次存储数据时,自动创建集合
        MongoCollection<Document> collection = database.getCollection("teachers");
        //获取数据,获取集合中第一个文档,并转为json打印
        System.out.println(collection.find().first().toJson());    //测试
        //关闭客户端
        if (mongoClient != null){
            mongoClient.close();
        }

如果有用户名和密码的话,连接的地址应该修改为:

java 复制代码
mongodb://username:password@host/?authSource=admin

2、Java 操作集合

2.1、创建集合

创建集合有多种方式:创建普通的集合,创建固定大小的集合(capped)、创建带校验规则的集合:

1、创建普通集合

java 复制代码
/**
     * 创建无限定集合
     * @param name 集合名称
     */
    public void createCollection(String name){
        database.createCollection(name);
    }

2、创建固定大小的集合

java 复制代码
/**
     * 创建固定大小的集合
     * @param name 集合名称
     * @param size 集合大小
     */
    public void createCollection(String name,long size){
        database.createCollection(name,new CreateCollectionOptions().capped(true).sizeInBytes(size));
    }

3、创建带校验规则的集合

java 复制代码
 /**
     * 创建带校验规则的集合
     * 在插入文档时必须存在两个字段:existsFiledName1和existsFiledName2
     * @param name 集合名称
     * @param existsFiledName1 字段1
     * @param existsFiledName2 字段2
     */
    public void createCollectionWithFilter(String name,String existsFiledName1,String existsFiledName2){
        ValidationOptions validationOptions = new ValidationOptions().validator(
                Filters.or(Filters.exists(existsFiledName1), Filters.exists(existsFiledName2))
        );
        database.createCollection(name,new CreateCollectionOptions().validationOptions(validationOptions));
    }

2.2、获取集合

java 复制代码
 public MongoCollection<Document> getCollection(String name){
        return database.getCollection(name);
    }

2.3、删除集合

java 复制代码
/**
     * 删除集合
     */
    public void dropCollection(String collectionName){
        MongoCollection<Document> collection = getCollection(collectionName);
        collection.drop();
    }

3、Java 操作文档

3.1、插入单个文档

java 复制代码
/**
     * 插入一个文档
     * 创建一个文档对象,参数可以接收键值对,也可以直接接收一个Map对象
     * 文档对象的本质是BSON类型,还类型对应java中的Map,BSON数组对应Java中的List
     * Document.append(String key,Object value);    键指的是字段名 值可以是字符串可以是Document对象或者List数组
     */
    public void insertDocument(String collectionName,Map<String,Object> map){
        Document doc = new Document();
        for (String key : map.keySet()) {
            doc.append(key,map.get(key));
        }
        MongoCollection<Document> collection = getCollection(collectionName);
        collection.insertOne(doc);
    }

3.2、插入多个文档

java 复制代码
/**
     * 插入多个文档
     */
    public void insertDocuments(String collectionName,List<Document> documents){
        MongoCollection<Document> collection = getCollection(collectionName);
        collection.insertMany(documents);
    }

3.3、修改单个文档

这里用的是 Filters.eq() 相当于判断是否等于,如果有数值型的字段,可以用Filters.lt() 表示小于、Filters.gt() 表示大于...

java 复制代码
 /**
     *
     * @param collectionName 集合名称
     * @param conditionFiledName 查询条件字段名
     * @param value 查询条件字段对应的值
     * @param updateList 更新后的字段键值对列表 注意:这里需要传入一个List<Document>集合,其中,Document对象的key应该为"$set",值为新的Document对象
     */
    public void updateDocument(String collectionName,String conditionFiledName,String value,List<Document> updateList){
        MongoCollection<Document> collection = getCollection(collectionName);
        collection.updateOne(Filters.eq(conditionFiledName,value),updateList);
    }

3.4、修改多个文档

java 复制代码
//修改多个文档 所有订单数量<100的订单全部+1
        MongoCollection<Document> collection = getCollection("orders");
//给满足条件的订单的订单数目全部+100
        UpdateResult updateResult = collection.updateMany(Filters.eq("order_nums",100), Updates.inc("order_nums", 100));
        System.out.println(updateResult.getModifiedCount());

3.5、删除文档

java 复制代码
 //删除单个条件文档
        MongoCollection<Document> collection = getCollection("orders");
        collection.deleteOne(Filters.eq("order_id","0003"));
//删除多个满足条件文档
collection.deleteOne(Filters.eq("order_num","100"));

4、Java 查询文档

4.1、查询所有文档

java 复制代码
MongoCollection<Document> collection = getCollection("students");
        //查询所有文档
        MongoCursor<Document> cursor = collection.find().iterator();
//        MongoCursor<Document> cursor = collection.find().limit(100);//只看前100行
//        MongoCursor<Document> cursor = collection.find().first();//只看第一行
        try {
            while (cursor.hasNext()) {
                System.out.println(cursor.next().toJson());
            }
        }finally {
            cursor.close();
        }

4.2、条件查询

主要依靠Filters类进行拦截过滤。

java 复制代码
//多条件查询 60<=score<80 并且 address="山西"(如果address是数组,则"山西"包含在内即可)
        FindIterable<Document> documents = collection.find(
                new Document("score", new Document("$gte", 60)
                        .append("$lt", 80))
                        .append("address", "山西")
        );
        //等价于上面的
        collection.find(Filters.and(
                Filters.gte("score",60),
                Filters.lt("score",80),
                Filters.eq("address","山西")));

4.3、投影

投影就是选择展示的字段,因为默认是全部展示的。即使设置了想要展示的字段,"_id"字段也会被展示,需要用专门指定"_id"为0或者使用 Projections.excludeId()。

java 复制代码
 //投影
        collection.find(
                Filters.eq("name","李大喜")
                ).projection(new Document("name",1)
                .append("sex",1)
                .append("age",1)
                .append("_id",0)
        );
        //等价于上面的投影 Projections.excludeId() 不展示 _id
        collection.find(
                Filters.eq("name","李大喜"))
        .projection(Projections.fields(Projections.include("name","sex","age"),Projections.excludeId()));

4.4、排序

java 复制代码
//排序 先按照年龄排序 年龄一样的安照工资排序
        //asc 升序
        //desc 降序
        collection.find(Filters.lt("age",50))
        .sort(Sorts.ascending("age","sal"));
相关推荐
网安-轩逸39 分钟前
IPv4地址表示法详解
开发语言·php
play_big_knife39 分钟前
鸿蒙项目云捐助第二十八讲云捐助项目首页组件云数据库加载轮播图
数据库·华为·harmonyos·鸿蒙·云开发·鸿蒙开发·鸿蒙技术
qq_321665332 小时前
mysql 数据库迁移到达梦数据库
数据库·mysql
陌上花开࿈3 小时前
调用第三方接口
java
Aileen_0v03 小时前
【玩转OCR | 腾讯云智能结构化OCR在图像增强与发票识别中的应用实践】
android·java·人工智能·云计算·ocr·腾讯云·玩转腾讯云ocr
Hello.Reader3 小时前
Redis大Key问题全解析
数据库·redis·bootstrap
西猫雷婶4 小时前
python学opencv|读取图像(十九)使用cv2.rectangle()绘制矩形
开发语言·python·opencv
桂月二二5 小时前
Java与容器化:如何使用Docker和Kubernetes优化Java应用的部署
java·docker·kubernetes
靖顺5 小时前
【OceanBase 诊断调优】—— packet fly cost too much time 的根因分析
数据库·oceanbase
liuxin334455665 小时前
学籍管理系统:实现教育管理现代化
java·开发语言·前端·数据库·安全