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"));
相关推荐
Abladol-aj1 小时前
并发和并行的基础知识
java·linux·windows
清水白石0081 小时前
从一个“支付状态不一致“的bug,看大型分布式系统的“隐藏杀机“
java·数据库·bug
Elihuss2 小时前
ONVIF协议操作摄像头方法
开发语言·php
Swift社区5 小时前
在 Swift 中实现字符串分割问题:以字典中的单词构造句子
开发语言·ios·swift
没头脑的ht5 小时前
Swift内存访问冲突
开发语言·ios·swift
没头脑的ht5 小时前
Swift闭包的本质
开发语言·ios·swift
wjs20245 小时前
Swift 数组
开发语言
Python私教5 小时前
model中能定义字段声明不存储到数据库吗
数据库·oracle
吾日三省吾码6 小时前
JVM 性能调优
java
stm 学习ing6 小时前
FPGA 第十讲 避免latch的产生
c语言·开发语言·单片机·嵌入式硬件·fpga开发·fpga