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管道方法参考。
经验分享 程序员 微信小程序 职场和发展