专业编程基础技术教程

网站首页 > 基础教程 正文

MongoTemplate 聚合 lookup 关联查询字段不同类型

ccvgpt 2024-10-29 13:19:42 基础教程 9 ℃

在用 lookup做关联表查询时要注意两种情况,关联的字段类型是否一致


MongoTemplate 聚合 lookup 关联查询字段不同类型

分类模型 (两种情况都一样)

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
//分类模型
@Data
@Document("category")
public class Category {
    @Id
    private String id;
    private String name;
}


第一种 关联表中的id 用ObjectId类型

//商品模型
import lombok.Data;
import org.bson.types.ObjectId;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

@Data
@Document("product")
public class Product {

    @Id
    private String id;
    private String name;
    // 注意,这里用的是 ObjectId
    private ObjectId categoryId;
}

这种网络上有很多教程直接上代码

List<AggregationOperation> operationList = new ArrayList();
       
        LookupOperation lookup = LookupOperation.newLookup()
          // 从表的表名      
          .from("category")
          //主表中要关联的字段
          .localField("categoryId")
          //从表中要关联的字段
          .foreignField("_id")
          //临时集合别名
          .as("categoryData");

        operationList.add(lookup);

        //方便测试只查一条数据
        AggregationOperation match = Aggregation.match(
                Criteria.where("_id").is( new ObjectId("6262616806216427cf9345fc") )
        );
        operationList.add(match);

        Aggregation agg = Aggregation.newAggregation(operationList);
        //主表表名
        AggregationResults<Map> aggregationResults = mongoTemplate.aggregate(agg, "product", Map.class);
        
        //结果
        System.out.println(aggregationResults.getMappedResults());


第二种 关联表中的id 用String类型

import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
//商品模型
@Data
@Document("product")
public class Product {

    @Id
    private String id;
    private String name;
    // 注意,这里用的是 String
    private String categoryId;
}


这里的商品中的分类categoryId 类型为String 而分类中的id为 ObjectId。

当用mongoTemplate中的Lookup做关联查询时 要对categoryId做类型转换

List<AggregationOperation> operationList = new ArrayList();
        //关键,在这里对 categoryId做类型转换 
        //目前测试 主表字段转类型成功 从表类型失败
        AddFieldsOperation addFields = AddFieldsOperation.addField("categoryId").withValue(ConvertOperators.ToObjectId.toObjectId("$categoryId")).build();
       

        LookupOperation lookup = LookupOperation.newLookup()
          // 从表的表名      
          .from("category")
          //主表中要关联的字段
          .localField("categoryId")
          //从表中要关联的字段
          .foreignField("_id")
          //临时集合别名
          .as("categoryData");

        operationList.add(addFields);
        operationList.add(lookup);

        //方便测试只查一条数据
        AggregationOperation match = Aggregation.match(
                Criteria.where("_id").is( new ObjectId("6262616806216427cf9345fc") )
        );
        operationList.add(match);

        Aggregation agg = Aggregation.newAggregation(operationList);
        //主表表名
        AggregationResults<Map> aggregationResults = mongoTemplate.aggregate(agg, "product", Map.class);
        
        //结果
        System.out.println(aggregationResults.getMappedResults());

最近发表
标签列表