大数据学习栈记——MongoDB编程

本文介绍NoSQL技术:MongoDB用Java来连接数据库,执行常见的数据库操作,使用环境:IntelliJ IDEA、Ubuntu24.04。

配置Maven

我们需要使用"MongoDB Driver",所以先打开"MongoDB Java Driver"项目,但是提示说这个项目已经不维护了,被"mongodb-driver-sync"这个项目替代了:

我们根据链接,跳转到"mongodb-driver-sync"项目,这个项目的名称显示为"MongoDB Driver"

在maven项目的pom.xml文件中添加依赖:

XML 复制代码
<!-- https://mvnrepository.com/artifact/org.mongodb/mongodb-driver-sync -->
<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver-sync</artifactId>
    <version>5.0.1</version>
</dependency>

点击右侧的Maven,展开Dependencies,可以看到新的一个mongodb的依赖包已经导入进来了:

与MongoDB建立连接(Java模式)

首先在项目中建立一个"mongodb"的包

编写一个类,测试一下MongoDB能否连通。

MongoClient mongoClient = new MongoClient("192.168.70.150", 27017); //这种方法已经淘汰

重写写一个类来完成Mongdb的连接测试。但是,MongoDB如果直接连由于安全问题会访问拒绝,我们需要在Ubuntu中配置关闭防火墙,同时还需要配置mongodb允许远程使用(默认为仅本地访问),才能从远程访问。

执行下列代码:

sudo vim /etc/mongod.conf

把bindIp修改为0.0.0.0,然后保存

在nosql这台虚拟机上执行下列代码来重启mongodb服务:

sudo service mongod restart

执行代码

java 复制代码
package MongoDB;

import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
// import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;

public class TestMongoDB {
    public static void main(String[] args) {
        String uri = "mongodb://192.168.179.143:27017";  // 数据库连接uri
        try (MongoClient mongoClient = MongoClients.create(uri)) {
            MongoDatabase database = mongoClient.getDatabase("school1");    // 创建数据库school1
            database.createCollection("teacher");  // 创建集合teacher
            System.out.println("集合创建成功!");
        }
    }
}

显示集合创建成功!

在nosql这台虚拟机的shell模式下查看,发现school1数据库和集合teacher都已经创建成功

说明:

(1)在Java 源代码中,Java tryO0用法中,括号(的作用属于Java7的新特性。

经常会用try-catch来捕获有可能抛出异常的代码。如果其中还涉及到资源的使用的话,最后在finally块中显示的释放掉有可能被占用的资源。

但是如果资源类已经实现了AutoCloseable这个接口的话,可以在 tryO括号中可以写操作资源的语句(IO操作),会在程序块结束时自动释放掉占用的资源,不用再在finally块中手动释放了。

原文链接:https://blog.csdn.net/qq_25112523/article/details/124746116

在MongoDB中新增数据

在MongoDB中新增数据有两种方法,第一种是增加一条数据(文档),第二种是增加多条数据(文档)。

方法一:增加一条数据(文档)

java 复制代码
package MongoDB;

import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.result.InsertOneResult;
import com.mongodb.MongoException;

import org.bson.Document;
import org.bson.types.ObjectId;

import java.util.Arrays;

public class InsertOne {

    public static void main(String[] args) {
        String uri = "mongodb://192.168.179.143:27017";  // 数据库连接uri
        try (MongoClient mongoClient = MongoClients.create(uri)) {
            MongoDatabase database = mongoClient.getDatabase("school1");
            MongoCollection<Document> collection = database.getCollection("teacher");
            try {
                // 在集合teacher中增加一条数据
                InsertOneResult result = collection.insertOne(new Document()
                        .append("_id", new ObjectId())
                        .append("name", "zhangsan")
                        .append("course", Arrays.asList("Big Data Technology", "Web Front-end Programming")));
                // 输出新增的文档内容
                System.out.println("成功! 新增文档的id: " + result.getInsertedId());

                // 如果出现异常,则打印该异常
            } catch (MongoException me) {
                System.err.println("Unable to insert due to an error: " + me);
            }
        }
    }
}

在Shell中查询

方法二:增加多条数据(文档)

java 复制代码
package MongoDB;

import java.util.Arrays;
import java.util.List;

import org.bson.Document;
import com.mongodb.MongoException;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.result.InsertManyResult;

public class InsertMany {
    public static void main(String[] args) {
        String uri = "mongodb://192.168.179.143:27017";  // 数据库连接uri
        try (MongoClient mongoClient = MongoClients.create(uri)) {
            MongoDatabase database = mongoClient.getDatabase("school1");
            MongoCollection<Document> collection = database.getCollection("teacher");
            // 创建两个包含name和age属性的文档,注意这里和InsertOne的格式不同,这并没有什么关系
            List<Document> teacherList = Arrays.asList(
                    new Document().append("name", "Alice").append("age", 30),
                    new Document().append("name", "Bob").append("age", 40));
            try {
                // 把文档增加到teacher集合中
                InsertManyResult result = collection.insertMany(teacherList);
                // 打印返回的id值
                System.out.println("新增文档的id值: " + result.getInsertedIds());

                // 如果出现异常,则打印该异常
            } catch (MongoException me) {
                System.err.println("Unable to insert due to an error: " + me);
            }
        }
    }
}

在Shell中查询:

在MongoDB中查询数据

在MongoDB中查询数据有两种方法,第一种是查询一条数据(文档),第二种是查询多条数据(文档)。

方法一:查询一条数据(文档)

java 复制代码
package MongoDB;

import static com.mongodb.client.model.Filters.eq;

import org.bson.Document;
import org.bson.conversions.Bson;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Projections;
import com.mongodb.client.model.Sorts;

public class FindOne {
    public static void main(String[] args) {
        String uri = "mongodb://192.168.179.143:27017";  // 数据库连接uri
        try (MongoClient mongoClient = MongoClients.create(uri)) {
            MongoDatabase database = mongoClient.getDatabase("school1");
            MongoCollection<Document> collection = database.getCollection("teacher");
            // 先把有name属性的文档过滤出来
            Bson projectionFields = Projections.fields(
                    Projections.include("name"),
                    Projections.excludeId());
            // 返回满足条件的第一个文档
            Document doc = collection.find(eq("name", "zhangsan"))
                    .projection(projectionFields)
                    .sort(Sorts.descending("name"))
                    .first();
            // 没有找到则告之未找到,否则把该文档用JSON格式输出
            if (doc == null) {
                System.out.println("没有找到文档");
            } else {
                System.out.println(doc.toJson());
            }
        }
    }
}

方法二:查询多条数据(文档)

java 复制代码
package MongoDB;

import static com.mongodb.client.model.Filters.lt;

import org.bson.Document;
import org.bson.conversions.Bson;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Projections;
import com.mongodb.client.model.Sorts;

public class Find {
    public static void main(String[] args) {
        String uri = "mongodb://192.168.179.143:27017";  // 数据库连接uri
        try (MongoClient mongoClient = MongoClients.create(uri)) {
            MongoDatabase database = mongoClient.getDatabase("school1");
            MongoCollection<Document> collection = database.getCollection("teacher");
            // 先把有name和age属性的文档过滤出来
            Bson projectionFields = Projections.fields(
                    Projections.include("name", "age"),
                    Projections.excludeId());
            // 找到符合条件的文档,这里查询条件为年龄小于50岁,并用name逆序排列
            // 把查询结果用JSON格式打印出来
            try (MongoCursor<Document> cursor = collection.find(lt("age", 50))
                    .projection(projectionFields)
                    .sort(Sorts.descending("name")).iterator()) {
                while (cursor.hasNext()) {
                    System.out.println(cursor.next().toJson());
                }
            }
        }
    }
}

在MongoDB中更新数据

在MongoDB中更新数据有两种方法,第一种是更新一条数据(文档),第二种是更新多条数据(文档)。

方法一:更新一条数据(文档)

java 复制代码
package MongoDB;

import org.bson.Document;
import org.bson.conversions.Bson;
import com.mongodb.MongoException;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.UpdateOptions;
import com.mongodb.client.model.Updates;
import com.mongodb.client.result.UpdateResult;

public class UpdateOne {
    public static void main(String[] args) {
        String uri = "mongodb://192.168.179.143:27017";  // 数据库连接uri
        try (MongoClient mongoClient = MongoClients.create(uri)) {
            MongoDatabase database = mongoClient.getDatabase("school1");
            MongoCollection<Document> collection = database.getCollection("teacher");
            Document query = new Document().append("name", "Alice");
            // 更新文档的三个值,age是已经存在的属性,gender是新增的属性,currentTimestamp是新增的更新时间属性
            Bson updates = Updates.combine(
                    Updates.set("age", 31),
                    Updates.addToSet("gender", "Male"),
                    Updates.currentTimestamp("lastUpdated"));
            // 如何没有找到符合查询条件的记录,则新增该记录
            UpdateOptions options = new UpdateOptions().upsert(true);
            try {
                // 更新符合条件的第一个文档
                UpdateResult result = collection.updateOne(query, updates, options);
                // 打印文档的属性
                System.out.println("修改文档的数据是: " + result.getModifiedCount());
                System.out.println("被修改的文档ID是: " + result.getUpsertedId());

                // 如果出现异常,则打印该异常
            } catch (MongoException me) {
                System.err.println("无法更新,异常是: " + me);
            }
        }
    }
}

程序这边有一定问题

在Shell中查询无问题

发现Alice这条数据已经被更新了。

方法二:更新多条数(文档)

java 复制代码
package MongoDB;

import static com.mongodb.client.model.Filters.gt;

import org.bson.Document;
import org.bson.conversions.Bson;
import com.mongodb.MongoException;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Updates;
import com.mongodb.client.result.UpdateResult;

public class UpdateMany {
    public static void main(String[] args) {
        String uri = "mongodb://192.168.179.143:27017";  // 数据库连接uri
        try (MongoClient mongoClient = MongoClients.create(uri)) {
            MongoDatabase database = mongoClient.getDatabase("school1");
            MongoCollection<Document> collection = database.getCollection("teacher");
            // 查询条件是年龄大于30
            Bson query = gt("age", 30);
            // 更新文档的属性
            Bson updates = Updates.combine(
                    Updates.addToSet("interests", "programming"),
                    Updates.currentTimestamp("lastUpdated"));
            try {
                // 更新文档数据
                UpdateResult result = collection.updateMany(query, updates);
                // 答应更新结果
                System.out.println("更新文档的个数: " + result.getModifiedCount());
                // 如果出现异常,则打印该异常
            } catch (MongoException me) {
                System.err.println("Unable to update due to an error: " + me);
            }
        }
    }
}

在Shell中查询

发现Alice和Bob这两条数据已经被更新了。

在更新操作中,还有一类程序时把一个文档全部替换掉,你可以参考一下官方文档:

https://www.mongodb.com/docs/drivers/java/sync/current/usage-examples/replaceOne/

在MongoDB中删除数据(Java模式)

在MongoDB中删除数据有两种方法,第一种是删除一条数据(文档),第二种是删除多条数据(文档)。

方法一:删除一条数据(文档)

java 复制代码
package MongoDB;

import static com.mongodb.client.model.Filters.eq;

import org.bson.Document;
import org.bson.conversions.Bson;
import com.mongodb.MongoException;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.result.DeleteResult;

public class DeleteOne {
    public static void main(String[] args) {
        String uri = "mongodb://192.168.179.143:27017";  // 数据库连接uri
        try (MongoClient mongoClient = MongoClients.create(uri)) {
            MongoDatabase database = mongoClient.getDatabase("school1");
            MongoCollection<Document> collection = database.getCollection("teacher");
            Bson query = eq("name", "zhangsan");
            try {
                // 删除满足条件的第一个文档
                DeleteResult result = collection.deleteOne(query);
                System.out.println("删除文档个数: " + result.getDeletedCount());
                // 如果出现异常,则打印该异常
            } catch (MongoException me) {
                System.err.println("Unable to delete due to an error: " + me);
            }
        }
    }
}

在Shell中查询

方法二:删除多条数据(文档)

java 复制代码
package MongoDB;

import static com.mongodb.client.model.Filters.lt;

import org.bson.Document;
import org.bson.conversions.Bson;
import com.mongodb.MongoException;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.result.DeleteResult;

public class DeleteMany {
    public static void main(String[] args) {
        String uri = "mongodb://192.168.179.143:27017";  // 数据库连接uri
        try (MongoClient mongoClient = MongoClients.create(uri)) {
            MongoDatabase database = mongoClient.getDatabase("school1");
            MongoCollection<Document> collection = database.getCollection("teacher");
            Bson query = lt("age", 50);
            try {
                // 删除所有年龄小于50的问句
                DeleteResult result = collection.deleteMany(query);

                // 打印删除文档的数量
                System.out.println("Deleted document count: " + result.getDeletedCount());

                // 如果出现异常,则打印该异常
            } catch (MongoException me) {
                System.err.println("Unable to delete due to an error: " + me);
            }
        }
    }
}

在Shell中查询

teacher集合中已经没有数据了,因为一个三条数据,第一次(删除一条数据(文档)的那个程序)删了1条,第二次删了2条(删除多条数据(文档)的那个程序),所以就全部删光了

相关推荐
babe小鑫几秒前
零经验转行学习数据分析的价值分析
学习·数据挖掘·数据分析
zhangrelay14 分钟前
三分钟云课实践速通--单片机原理与应用--Arduino--SimulIDE--
linux·单片机·嵌入式硬件·学习·ubuntu
AI周红伟19 分钟前
数字人,视频,图片用不过时
大数据·人工智能·搜索引擎·copilot·openclaw
格林威30 分钟前
工业视觉检测:单样本学习 vs 传统监督学习
人工智能·深度学习·数码相机·学习·计算机视觉·视觉检测·工业相机
vooy pktc32 分钟前
Spring Security 官网文档学习
java·学习·spring
light blue bird33 分钟前
设备数据变化上传图表数据汇总组件
大数据·前端·信息可视化
Treh UNFO40 分钟前
nginx的重定向
大数据·数据库·nginx
TechMix43 分钟前
【fkw学习笔记】Android 13 AOSP 源码添加系统预置应用实战指南
android·笔记·学习
天诚智能门锁1 小时前
天诚cat.1人脸公租房智能锁及管控平台助力三门县公租房管理
大数据·人工智能·物联网·智慧城市·公租房
2601_956414141 小时前
2026年5月PCB厂家推荐:TOP5榜产品应对5G基站散热挑战
大数据·人工智能·5g