当前位置: 首页 > news >正文

大数据学习栈记——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文件中添加依赖:

<!-- 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";  // 数据库连接uritry (MongoClient mongoClient = MongoClients.create(uri)) {MongoDatabase database = mongoClient.getDatabase("school1");    // 创建数据库school1database.createCollection("teacher");  // 创建集合teacherSystem.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";  // 数据库连接uritry (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";  // 数据库连接uritry (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";  // 数据库连接uritry (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";  // 数据库连接uritry (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";  // 数据库连接uritry (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";  // 数据库连接uritry (MongoClient mongoClient = MongoClients.create(uri)) {MongoDatabase database = mongoClient.getDatabase("school1");MongoCollection<Document> collection = database.getCollection("teacher");// 查询条件是年龄大于30Bson 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";  // 数据库连接uritry (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";  // 数据库连接uritry (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条(删除多条数据(文档)的那个程序),所以就全部删光了

相关文章:

  • 【Web三十一】K8S的常用命令
  • 设计模式-模板模式
  • Node.js 模块包的管理和使用是
  • Qt:解决MSVC编译器下qDebug输出中文乱码的问题
  • 中英文提示词对AI IDE编程能力影响有多大?
  • 三层交换机SVI功能(交换机虚拟接口)实现各个实训室电脑网络可互通,原本是独立局域网
  • MATLAB仿真多相滤波抽取与插值的频谱变化(可视化混叠和镜像)
  • TypeScript 进阶指南 - 使用泛型与keyof约束参数
  • spark简介和核心编程
  • spark-sql核心
  • 试一下阿里云新出的mcp服务
  • 鸿蒙动画与交互设计:ArkUI 3D变换与手势事件详解
  • 【字节跳动AI论文】Seaweed-7B:视频生成基础模型的高成本效益培训
  • 栈与队列习题分享(精写)
  • chrome无法访问此网站怎么回事 分享5种解决方法
  • 模拟集成电路设计与仿真 : PLL
  • CentOS DVD完整版与Minimal版的区别
  • 筛选条件在on和where中的区别(基于hivesql)
  • 数据结构·树
  • Upwork全球化战略:用“文化套利”收割国际客户
  • 5天完成1000多万元交易额,“一张手机膜”畅销海内外的启示
  • 马云再次现身阿里打卡创业公寓“湖畔小屋”,鼓励员工坚持创业精神
  • 临港新片区:发布再保险、国际航运、生物医药3个领域数据出境操作指引
  • 市自规局公告收回新校区建设用地,宿迁学院:需变更建设主体
  • “仓促、有限”,美英公布贸易协议框架,两国分别获得了什么?
  • 阿里CEO:将以饱和式投入打法,聚焦几大核心战役