网站首页 > 基础教程 正文
在用 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());
猜你喜欢
- 2024-10-29 57个挑战之57(part6):客户端+web前端+服务端代码实现
- 2024-10-29 技术干货|MongoDB数据库常见操作命令
- 2024-10-29 ABP vNext框架文档解读28-数据过滤
- 2024-10-29 自建MongoDB实践:MongoDB 分片集群
- 2024-10-29 小程序 随机读取数据并生成分享图片 上手笔记
- 2024-10-29 go-mongox:简单高效,让文档操作和 bson 数据构造更流畅
- 2024-10-29 当MongoDB遇见Spark mongodb campass
- 2024-10-29 MongoDB 5.0 官方文档学习笔记 mongodb教程
- 2024-10-29 好东西,MySQL 数据库 MongoDB详解
- 2024-10-29 MongoDB 入门 day04 mongodb27017
- 最近发表
- 标签列表
-
- jsp (69)
- pythonlist (60)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- gitclone命令 (63)
- dockersave (62)
- linux命令大全 (65)
- mysql教程 (60)
- pythonif (86)
- location.href (69)
- deletesql (62)
- c++模板 (62)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- console.table (62)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)