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"));
相关推荐
恒辉信达12 分钟前
hhdb数据库介绍(8-4)
服务器·数据库·mysql
blammmp18 分钟前
Java:数据结构-枚举
java·开发语言·数据结构
何曾参静谧31 分钟前
「C/C++」C/C++ 指针篇 之 指针运算
c语言·开发语言·c++
暗黑起源喵36 分钟前
设计模式-工厂设计模式
java·开发语言·设计模式
WaaTong41 分钟前
Java反射
java·开发语言·反射
Troc_wangpeng42 分钟前
R language 关于二维平面直角坐标系的制作
开发语言·机器学习
努力的家伙是不讨厌的44 分钟前
解析json导出csv或者直接入库
开发语言·python·json
Envyᥫᩣ1 小时前
C#语言:从入门到精通
开发语言·c#
全能全知者1 小时前
docker快速安装与配置mongoDB
mongodb·docker·容器
齐 飞1 小时前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb