MongoDB-JAVA-Driver 3.2版本常用代码全整理(3)

转载,原文连接:http://blog.csdn.net/autfish/article/details/51379379

MongoDB的3.x版本Java驱动相对2.x做了全新的设计,类库和使用方法上有很大区别。例如用Document替换BasicDBObject、通过Builders类构建Bson替代直接输入$命令等,本文整理了基于3.2版本的常用增删改查操作的使用方法。为了避免冗长的篇幅,分为增删改、查询、聚合、地理索引等几部分。

聚合用于统计文档个数、求和、最大最小值、求平均值等,功能和函数名称和SQL中的count、distinct、group等关键字非常类似,此外,还可以通过JavaScript编写MapReduce实现复杂的计算(性能损耗也会非常严重)。

首先来看3.x驱动中的聚合方法的声明:

AggregateIterable<TDocument> aggregate(List<? extends Bson> pipeline)

参数类型是一个Bson的列表,而参数名称是pipeline,其构建方式正如其名,是以多个Bson建立起一条管道,前一个Bson的输出将作为后一个Bson的输入,例如:

mc.aggregate(Arrays.asList(match(eq("owner", "tom")), group("$author", sum("totalWords", "$words"))));

首先用$match查找出owner=tom的文档,并将结果集传递给$group并对字数求和。

下面来看更多命令用法,用于演示的类的基本代码如下

[java] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. import static com.mongodb.client.model.Accumulators.*;  
  2. import static com.mongodb.client.model.Aggregates.*;  
  3. import static com.mongodb.client.model.Filters.eq;  
  4.   
  5. import java.text.ParseException;  
  6. import java.util.Arrays;  
  7.   
  8. import org.bson.Document;  
  9.   
  10. import com.mongodb.Block;  
  11. import com.mongodb.MongoClient;  
  12. import com.mongodb.client.AggregateIterable;  
  13. import com.mongodb.client.MongoCollection;  
  14. import com.mongodb.client.MongoDatabase;  
  15.   
  16. public class AggregatesExamples {  
  17.   
  18.     public static void main(String[] args) throws ParseException {  
  19.         //根据实际环境修改ip和端口  
  20.         MongoClient mongoClient = new MongoClient("localhost", 27017);  
  21.         MongoDatabase database = mongoClient.getDatabase("lesson");  
  22.           
  23.         AggregatesExamples client = new AggregatesExamples(database);  
  24.         client.show();  
  25.         mongoClient.close();  
  26.     }  
  27.       
  28.     private MongoDatabase database;  
  29.     public AggregatesExamples(MongoDatabase database) {  
  30.         this.database = database;  
  31.     }  
  32.       
  33.     public void show() {  
  34.         MongoCollection<Document> mc = database.getCollection("blog");  
  35.         //每次执行前清空集合以方便重复运行  
  36.         mc.drop();  
  37.           
  38.         //插入用于测试的文档  
  39.         Document doc1 = new Document("title", "good day").append("owner", "tom").append("words", 300)  
  40.                 .append("comments", Arrays.asList(new Document("author", "joe").append("score", 3).append("comment", "good"), new Document("author", "white").append("score", 1).append("comment", "oh no")));  
  41.         Document doc2 = new Document("title", "good").append("owner", "john").append("words", 400)  
  42.                 .append("comments", Arrays.asList(new Document("author", "william").append("score", 4).append("comment", "good"), new Document("author", "white").append("score", 6).append("comment", "very good")));  
  43.         Document doc3 = new Document("title", "good night").append("owner", "mike").append("words", 200)  
  44.                 .append("tag", Arrays.asList(1, 2, 3, 4));  
  45.         Document doc4 = new Document("title", "happiness").append("owner", "tom").append("words", 1480)  
  46.                 .append("tag", Arrays.asList(2, 3, 4));  
  47.         Document doc5 = new Document("title", "a good thing").append("owner", "tom").append("words", 180)  
  48.                 .append("tag", Arrays.asList(1, 2, 3, 4, 5));  
  49.         mc.insertMany(Arrays.asList(doc1, doc2, doc3, doc4, doc5));  
  50.           
  51.         AggregateIterable<Document> iterable = mc.aggregate(Arrays.asList(match(eq("owner", "tom")),  
  52.                 group("$author", sum("totalWords", "$words"))));  
  53.         printResult("", iterable);  
  54.           
  55.         //TODO: 将在这里填充更多聚合示例  
  56.     }  
  57.       
  58.     //打印聚合结果  
  59.     public void printResult(String doing, AggregateIterable<Document> iterable) {  
  60.         System.out.println(doing);  
  61.         iterable.forEach(new Block<Document>() {  
  62.             public void apply(final Document document) {  
  63.                 System.out.println(document);  
  64.             }  
  65.         });  
  66.         System.out.println("------------------------------------------------------");  
  67.         System.out.println();  
  68.     }  
  69. }  

如上面代码所示,将把所有的聚合操作集中在show()方法中演示,并且在执行后打印结果集以观察执行结果。下面用常用的聚合代码填充show()方法

 注意需要静态导入:

import static com.mongodb.client.model.Accumulators.*;
import static com.mongodb.client.model.Aggregates.*;

[java] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. // $match 确定复合条件的文档, 可组合多个条件  
  2. iterable = mc.aggregate(Arrays.asList(match(and(eq("owner", "tom"), gt("words", 300)))));  
  3. printResult("$match only", iterable);  
  4.   
  5. // $sum求和 $avg平均值 $max最大值 $min最小值  
  6. iterable = mc.aggregate(Arrays.asList(  
  7.         match(in("owner", "tom", "john", "mike")),  
  8.         group("$owner", sum("totalWords", "$words"),  
  9.                 avg("averageWords", "$words"),  
  10.                 max("maxWords", "$words"), min("minWords", "$words"))));  
  11. printResult("$sum $avg $max $min", iterable);  
  12.   
  13. // $out 把聚合结果输出到集合  
  14. mc.aggregate(Arrays.asList(  
  15.         match(in("owner", "tom", "john", "mike")),  
  16.         group("$owner", sum("totalWords", "$words"),  
  17.                 avg("averageWords", "$words"),  
  18.                 max("maxWords", "$words"), min("minWords", "$words")),  
  19.         out("wordsCount")));  
  20. iterable = database.getCollection("wordsCount").aggregate(  
  21.         Arrays.asList(sample(3)));  
  22. printResult("$out", iterable);  
  23.   
  24. // 随机取3个文档, 仅返回title和owner字段  
  25. iterable = mc.aggregate(Arrays.asList(sample(3),  
  26.         project(fields(include("title", "owner"), excludeId()))));  
  27. printResult("sample(3)", iterable);  
  28.   
  29. // 从第2个文档开始取2个文档, 仅返回title和owner字段  
  30. iterable = mc.aggregate(Arrays.asList(skip(1), limit(2),  
  31.         project(fields(include("title", "owner"), excludeId()))));  
  32. printResult("skip(1), limit(2)", iterable);  
  33.   
  34. // $lookup 和另一个集合关联  
  35. database.getCollection("scores").drop();  
  36. database.getCollection("scores").insertMany(  
  37.         Arrays.asList(  
  38.                 new Document("writer", "tom").append("score", 100),  
  39.                 new Document("writer", "joe").append("score", 95),  
  40.                 new Document("writer", "john").append("score", 80)));  
  41. iterable = mc.aggregate(Arrays.asList(lookup("scores", "owner",  
  42.         "writer", "joinedOutput")));  
  43. printResult("lookup", iterable);  
  44.   
  45. // 拆分comments为单个文档  
  46. iterable = mc.aggregate(Arrays.asList(match(size("comments", 2)),  
  47.         project(fields(include("comments"), excludeId())),  
  48.         unwind("$comments")));  
  49. printResult("unwind comments", iterable);  
  50.   
  51. System.out.println("distinct");  
  52. DistinctIterable<String> di = mc.distinct("owner", String.class);  
  53. di.forEach(new Block<String>() {  
  54.     public void apply(final String str) {  
  55.         System.out.println(str);  
  56.     }  
  57. });  
  58. System.out.println("------------------------------------------------------");  
  59. System.out.println();  
  60.   
  61. System.out.println("count");  
  62. long count = mc.count(Filters.eq("owner", "tom"));  
  63. System.out.println("count=" + count);  
  64. System.out.println("------------------------------------------------------");  
  65. System.out.println();  
  66.   
  67. System.out.println("mapreduce");  
  68. String map = "function() { var category; "  
  69.         + "if ( this.words >= 280 ) category = 'Long blogs'; "  
  70.         + "else category = 'Short blogs'; "  
  71.         + "emit(category, {title: this.title});}";  
  72.   
  73. String reduce = "function(key, values) { var cnt = 0; "  
  74.         + "values.forEach(function(doc) { cnt += 1; }); "  
  75.         + "return {count: cnt};} ";  
  76. MapReduceIterable<Document> mi = mc.mapReduce(map, reduce);  
  77. mi.forEach(new Block<Document>() {  
  78.     public void apply(final Document str) {  
  79.         System.out.println(str);  
  80.     }  
  81. });  
  82. System.out.println("------------------------------------------------------");  
  83. System.out.println();  

(完)

原文地址:https://www.cnblogs.com/sa-dan/p/6836591.html