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

发布于:2025-04-15 ⋅ 阅读:(24) ⋅ 点赞:(0)

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

配置Maven

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

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

在maven项目的pom.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

执行代码

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中新增数据有两种方法,第一种是增加一条数据(文档),第二种是增加多条数据(文档)。

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

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中查询

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

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中查询数据有两种方法,第一种是查询一条数据(文档),第二种是查询多条数据(文档)。

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

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());
            }
        }
    }
}

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

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中更新数据有两种方法,第一种是更新一条数据(文档),第二种是更新多条数据(文档)。

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

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这条数据已经被更新了。

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

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中删除数据有两种方法,第一种是删除一条数据(文档),第二种是删除多条数据(文档)。

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

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中查询

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

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条(删除多条数据(文档)的那个程序),所以就全部删光了


网站公告

今日签到

点亮在社区的每一天
去签到