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