Java MongoDB 联表操作Aggregate用法
联表操作优势
-
效率提升 可以指定操作步骤的顺序(如下代码中执行顺序是lookup->match->sort)
联表操作方法
首先,要实现联表查询,必须有一个表示连接所有表的中心,如下图中的good表。
代码实现
功能:实现联表查询分类为animal且将所得结果按照amount从小到大排序。
public static void main(String[] args) { // 获取数据库 MongoDatabase mongoDatabase = MongoDBUtils.getConnect(); MongoCollection<Document> good = mongoDatabase.getCollection("good"); // 联表操作指令集 List aggregateList = new ArrayList<>(); aggregateList.add(Aggregates.lookup("store", "category", "categoryName", "aggregateCategory")); aggregateList.add(Aggregates.lookup("price", "name", "name", "aggregateName")); aggregateList.add(Aggregates.match(Filters.in("category", "animal"))); aggregateList.add(Aggregates.sort(new Document("amount", 1))); MongoCursor cursor = good.aggregate(aggregateList).iterator(); while (cursor.hasNext()) { System.out.println(cursor.next()); } }
其中MongoDBUtils.getConnect()方法见中定义。
结果为
Document{ { _id=60d971225220604368266d29, amount=178, name=hamster2, category=animal, aggregateCategory=[Document{ { _id=60ed3d67bf5d00006b000519, categoryName=animal, storeroomNo=102, mananger=Mark}}], aggregateName=[Document{ { _id=60ed3c93bf5d00006b000517, name=hamster2, sellPrice=32, cost=16}}]}} Document{ { _id=60d971225220604368266d27, amount=188, name=hamster, category=animal, origin=Japan, aggregateCategory=[Document{ { _id=60ed3d67bf5d00006b000519, categoryName=animal, storeroomNo=102, mananger=Mark}}], aggregateName=[Document{ { _id=60ed3c85bf5d00006b000516, name=hamster, sellPrice=50, cost=23}}]}} Document{ { _id=60d96f4aa4c9ca6b149f75f8, amount=200, name=bird, category=animal, aggregateCategory=[Document{ { _id=60ed3d67bf5d00006b000519, categoryName=animal, storeroomNo=102, mananger=Mark}}], aggregateName=[Document{ { _id=60ed3c71bf5d00006b000515, name=bird, sellPrice=20, cost=12}}]}}
代码解读
首先得到主表good,并建立联表指令操作列表。
Aggregates下的lookup()、match()、sort()方法实际上就是组建一个嵌套的Document对象,最外层的键为"$lookup"、"$match"、"$sort",值为一个Document,代表需要操作的值,具体如下:
Aggregates.lookup()
实现了连联表查询的功能。该方法中四个参数依次代表:要联的表名、在主表中的字段名,在相连表中对应的字段名、相连的表中的数据集名称。
Aggregates.match()
寻找满足条件的数据。该方法中的参数为过滤器对象,即其中的Filters.in("category","animal")。
Aggregates.sort()
给数据排序,注意只能按照主表中的字段来排序。该方法中的参数为Document对象,如new Document("amount", 1),意思为按照amount从小到大排序;如果为new Document("amount", -1),相当于{ $sort: { amount: -1 } },意味着从大到小排序。
aggregate()
参数为联表操作指令集,作用是将Aggregate中所有的规则应用在主表中,即完成定义的联表操作。
更多Aggregate管道方法参考。
下一篇:
SQL语句——生成汉字首字母拼音