经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MongoDB » 查看文章
MongoDB Java API操作很全的整理
来源:cnblogs  作者:张永清  时间:2019/11/5 10:22:43  对本文有异议

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写,一般生产上建议以共享分片的形式来部署。 但是MongoDB官方也提供了其它语言的客户端操作API。如下图所示:

提供了C、C++、C#、.net、GO、java、Node.js、PHP、python、scala等各种语言的版本,如下图所示:

MongoDB的操作分为同步操作和异步操作以及响应式编程操作
一、同步操作API

官方JAVA API的路径:https://docs.mongodb.com/ecosystem/drivers/java/  我们这里以3.11的java 版本为例。各个版本的API对MongoDB服务的支持情况。

使用API时,先引入maven依赖

  1. <!-- https://mvnrepository.com/artifact/org.mongodb/mongo-java-driver -->
  2. <dependency>
  3. <groupId>org.mongodb</groupId>
  4. <artifactId>mongo-java-driver</artifactId>
  5. <version>3.11.1</version>
  6. </dependency>

  

 1、关于MongoDB Client的初始化和关闭。

从官方介绍来看,一般建议Client只需要一个建立一个长连接实例,然后使用时,都使用这个实例就可以,也就是可以用java的单例模式来创建连接实例。

 

  1. //mongoClient连接
  2. protected static MongoClient mongoClient;
  3. public synchronized static MongodbClient getInstance(String mongodbUrl) {
  4. if (null == mongoClient) {
  5. mongoClient = MongoClients.create(mongodbUrl);
  6. if(null != mongoClient){
  7. log.info("mongoClient init success!");
  8. }
  9. else{
  10. log.info("mongoClient init failed!");
  11. }
  12. }
  13. return mongodbClient;
  14. } 

  

直接通过mongodb的host和port来创建client: 

  1. MongoClient mongoClient = MongoClients.create("mongodb://host1:27017");

client连接到一个 Replica Set:

  1. MongoClient mongoClient = MongoClients.create("mongodb://host1:27017,host2:27017,host3:27017");
  2.  
  3. MongoClient mongoClient = MongoClients.create("mongodb://host1:27017,host2:27017,host3:27017/?replicaSet=myReplicaSet");

 或者通过MongoClientSettings.builder() 来辅助生成连接字符串来创建client:

  1. MongoClient mongoClient = MongoClients.create( MongoClientSettings.builder() .applyToClusterSettings(builder -> builder.hosts(Arrays.asList( new ServerAddress("host1", 27017), new ServerAddress("host2", 27017), new ServerAddress("host3", 27017)))) .build());

  连接关闭:

  1. public void close() {
  2. if(null!=mongoClient){
  3. mongoClient.close();
  4. mongoClient=null;
  5. }
  6. }

  2、关于MongoDB 的基本操作

  1. //创建Collection

  1. public void createCollection(String dataBaseName,String collectionName){
  2. getDatabase(dataBaseName).createCollection(collectionName);
  3. }
    //查询
    dataBaseName
  1. public MongoDatabase getDatabase(String dataBaseName){ return mongoClient.getDatabase(dataBaseName); }
    //查询
    Collection
  1. public List<String> listCollectionNames(String dataBaseName){
    List
    <String> stringList = new ArrayList<String>();
    mongoClient.getDatabase(dataBaseName).listCollectionNames().forEach((Consumer
    <? super String>) t->{ stringList.add(t); });
    return stringList; }

    public MongoCollection<Document> getCollectionByName(String dataBaseName, String collectionName){ return getDatabase(dataBaseName).getCollection(collectionName); }

 3、关于MongoDB 的查询操作

  1. //通过id(objectid)精确查询
  2. public FindIterable<Document> findMongoDbDocById(String dataBaseName, String collectionName, String id){
  3. BasicDBObject searchDoc = new BasicDBObject().append("_id", id);
  4. return getCollectionByName(dataBaseName,collectionName).find(searchDoc);
  5. }
  6. //通过id(objectid)模糊查询
  7. public FindIterable<Document> findMongoDbDocByIdRegex(String dataBaseName, String collectionName, String id){
  8. BasicDBObject searchDoc = new BasicDBObject().append("_id", new BasicDBObject("$regex",id));
  9. return getCollectionByName(dataBaseName,collectionName).find(searchDoc);
  10. }
  11. //通过开始id和结束id 查询(根据objectId范围查询)
  12. public FindIterable<Document> findMongoDbDocById(String dataBaseName, String collectionName, String startId,String endId){
  13. BasicDBObject searchDoc = new BasicDBObject().append("_id", new BasicDBObject("$gte", startId).append("$lte", endId));
  14. return getCollectionByName(dataBaseName,collectionName).find(searchDoc);
  15. }
  16. public FindIterable<Document> findMongoDbDoc(String dataBaseName, String collectionName,BasicDBObject basicDBObject){
  17. return getCollectionByName(dataBaseName,collectionName).find(basicDBObject);
  18. }
  19. //限制查询返回的条数
  20. public FindIterable<Document> findMongoDbDoc(String dataBaseName, String collectionName,BasicDBObject basicDBObject,Integer limitNum){
  21. return findMongoDbDoc(dataBaseName,collectionName,basicDBObject).limit(limitNum) ;
  22. }
  23. public FindIterable<Document> findMongoDbDocById(String dataBaseName, String collectionName, String startId,String endId,Integer limitNum){
  24. return findMongoDbDocById(dataBaseName,collectionName,startId,endId).limit(limitNum);
  25. }
  26.  
  27. /**
  28. * 降序查询(排序)
  29. * @param dataBaseName
  30. * @param collectionName
  31. * @param startId
  32. * @param endId
  33. * @param sortField 排序字段
  34. * @return
  35. */
  36. public FindIterable<Document> findMongoDbDocByIdDescSort(String dataBaseName, String collectionName, String startId,String endId,String sortField){
  37. return findMongoDbDocById(dataBaseName,collectionName,startId,endId).sort(new Document().append(sortField, -1));
  38. }
  39. public FindIterable<Document> findMongoDbDocByIdDescSort(String dataBaseName, String collectionName, String startId,String endId,String sortField,Integer limitNum){
  40. return findMongoDbDocByIdDescSort(dataBaseName,collectionName,startId,endId,sortField).limit(limitNum);
  41. }
  42.  
  43. /**
  44. * 降序查询(排序)
  45. * @param dataBaseName
  46. * @param collectionName
  47. * @param startId
  48. * @param endId
  49. * @param sortField 排序字段
  50. * @return
  51. */
  52. public FindIterable<Document> findMongoDbDocByIdAscSort(String dataBaseName, String collectionName, String startId,String endId,String sortField){
  53. return findMongoDbDocById(dataBaseName,collectionName,startId,endId).sort(new Document().append(sortField, 1));
  54. }
  55. public FindIterable<Document> findMongoDbDocByIdAscSort(String dataBaseName, String collectionName, String startId,String endId,String sortField,Integer limitNum){
  56. return findMongoDbDocByIdAscSort(dataBaseName,collectionName,startId,endId,sortField).limit(limitNum);
  57. }

   4、关于MongoDB 的插入操作

  1. //插入操作,注意插入时,如果数据已经存在会报错,插入时必须数据不存在,不会自动进行覆盖
  2. //插入单条记录
  3. public void insertDoc(String dataBaseName, String collectionName, Document document){
  4. getCollectionByName(dataBaseName,collectionName).insertOne(document);
  5. }
  6. //插入多条记录
  7. public void insertDoc(String dataBaseName, String collectionName,List<? extends Document> listData){
  8. getCollectionByName(dataBaseName,collectionName).insertMany(listData);
  9. }

   5、关于MongoDB 的更新操作

  1. //更新单条
  2. public void updateDoc(String dataBaseName, String collectionName, Bson var1, Bson var2){
  3. getCollectionByName(dataBaseName,collectionName).updateOne(var1,var2);
  4. }
  5. public void updateDoc(String dataBaseName, String collectionName, Bson var1, List<? extends Bson> list){
  6. getCollectionByName(dataBaseName,collectionName).updateOne(var1,list);
  7. }
  8. //批量更新
  9. public void updateDocs(String dataBaseName, String collectionName, Bson var1, Bson var2){
  10. getCollectionByName(dataBaseName,collectionName).updateMany(var1,var2);
  11. }
  12. public void updateDocs(String dataBaseName, String collectionName, Bson var1, List<? extends Bson> list){
  13. getCollectionByName(dataBaseName,collectionName).updateMany(var1,list);
  14. }

  6、关于MongoDB 的删除操作 

  1. //单条删除
  2. public DeleteResult deleteDoc(String dataBaseName, String collectionName, Bson var1){
  3. return getCollectionByName(dataBaseName,collectionName).deleteOne(var1);
  4. }
  5. //批量删除
  6. public DeleteResult deleteDocs(String dataBaseName, String collectionName,Bson var1){
  7. return getCollectionByName(dataBaseName,collectionName).deleteMany(var1);
  8. }

7、关于MongoDB 的替换操作

  1. //存在就替换,不存在的话就插入
  2. public UpdateResult replaceDoc(String dataBaseName, String collectionName, Bson var1, Document var2){
  3. return getCollectionByName(dataBaseName,collectionName).replaceOne(var1,var2);
  4. }

 9、关于MongoDB 的分页查询

mongodb的分页查询可以有多种思路来实现。

思路一:采用类似mysql的limit start end 的这种。

获取到总的数量:

  1. //查询总数
  2. public long countDocs(String dataBaseName, String collectionName,Bson var1){
  3. if(null==var1){
  4. return getCollectionByName(dataBaseName,collectionName).countDocuments();
  5. }
  6. return getCollectionByName(dataBaseName,collectionName).countDocuments(var1);
  7. }

//  分页查询,采用skip+limit的方式,在用了总数后,就可以分页了,skip的意思是前面跳过多少数据。

  1. public FindIterable<Document> findMongoDbDoc(String dataBaseName, String collectionName,BasicDBObject basicDBObject,Integer skip,Integer limit){
  2. return getCollectionByName(dataBaseName,collectionName).find(basicDBObject).skip(skip).limit(limit);
  3. }

  

 8、关于MongoDB 的bulkWrite操作 (批量写入)

二、异步操作API  

 mongodb异步驱动程序提供了异步api,可以利用netty或java 7的asynchronoussocketchannel实现快速、无阻塞的i/o,maven依赖

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.mongodb</groupId>
  4. <artifactId>mongodb-driver-async</artifactId>
  5. <version>3.11.1</version>
  6. </dependency>
  7. </dependencies>

官方地址:http://mongodb.github.io/mongo-java-driver/3.11/driver-async/getting-started/installation/

异步操作必然会涉及到回调,回调时采用ResultCallback<Document>

  1. SingleResultCallback<Document> callbackPrintDocuments = new SingleResultCallback<Document>() {
  2. @Override
  3. public void onResult(final Document document, final Throwable t) {
  4. System.out.println(document.toJson());
  5. }
  6. };
  7.  
  8. SingleResultCallback<Void> callbackWhenFinished = new SingleResultCallback<Void>() {
  9. @Override
  10. public void onResult(final Void result, final Throwable t) {
  11. System.out.println("Operation Finished!");
  12. }
  13. };

  异步insert操作

  1. collection.insertMany(documents, new SingleResultCallback<Void>() {
  2. @Override
  3. public void onResult(final Void result, final Throwable t) {
  4. System.out.println("Documents inserted!");
  5. }
  6. });

  异步删除操作

  1. collection.deleteMany(gte("i", 100), new SingleResultCallback<DeleteResult>() {
  2. @Override
  3. public void onResult(final DeleteResult result, final Throwable t) {
  4. System.out.println(result.getDeletedCount());
  5. }
  6. });

  异步更新操作

  1. collection.updateMany(lt("i", 100), inc("i", 100),
  2. new SingleResultCallback<UpdateResult>() {
  3. @Override
  4. public void onResult(final UpdateResult result, final Throwable t) {
  5. System.out.println(result.getModifiedCount());
  6. }
  7. });

  异步统计操作

  1. collection.countDocuments(
  2. new SingleResultCallback<Long>() {
  3. @Override
  4. public void onResult(final Long count, final Throwable t) {
  5. System.out.println(count);
  6. }
  7. });

  

三、MongoDB Reactive Streams 操作API

官方的MongoDB reactive streams Java驱动程序,为MongoDB提供异步流处理和无阻塞处理。

完全实现reactive streams api,以提供与jvm生态系统中其他reactive streams的互操作,一般适合于大数据的处理,比如spark,flink,storm等。

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.mongodb</groupId>
  4. <artifactId>mongodb-driver-reactivestreams</artifactId>
  5. <version>1.12.0</version>
  6. </dependency>
  7. </dependencies>

  官方地址:http://mongodb.github.io/mongo-java-driver-reactivestreams/

会包含如下三部分:

  1. Publisher:Publisher 是数据的发布者。Publisher 接口只有一个方法 subscribe,用于添加数据的订阅者,也就是 Subscriber。
  2. Subscriber: 是数据的订阅者。Subscriber 接口有4个方法,都是作为不同事件的处理器。在订阅者成功订阅到发布者之后,其 onSubscribe(Subscription s) 方法会被调用。
  3. Subscription:表示的是当前的订阅关系。

API问的地址:http://mongodb.github.io/mongo-java-driver-reactivestreams/1.12/javadoc/

 

 

 

代码示例:

  1. //建立连接
  2. MongoClient mongoClient = MongoClients.create(mongodbUrl);
  3. //获得数据库对象
  4. MongoDatabase database = client.getDatabase(databaseName);
  5. //获得集合
  6. MongoCollection collection = database.getCollection(collectionName);
  7.  
  8. //异步返回Publisher
  9. FindPublisher publisher = collection.find();
  10.  
  11. //订阅实现
  12. publisher.subscribe(new Subscriber() {
  13. @Override
  14. public void onSubscribe(Subscription str) {
  15. System.out.println("start...");
  16. //执行请求
  17. str.request(Integer.MAX_VALUE);
  18. }
  19. @Override
  20. public void onNext(Document document) {
  21. //获得文档
  22. System.out.println("Document:" + document.toJson());
  23. }
  24.  
  25. @Override
  26. public void onError(Throwable t) {
  27. System.out.println("error occurs.");
  28. }
  29.  
  30. @Override
  31. public void onComplete() {
  32. System.out.println("finished.");
  33. }
  34. });

  

 

 

 

原文链接:http://www.cnblogs.com/laoqing/p/11792578.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号