简单了解下mysql 如何实现 多表关联?
mysql 使用两个表关联用 A表 left join B表 on A.id=B.id 注 :A表为主表 |
mongdb 因为是文档存储的所以和MySQL有些许不一样。
db.comment.aggregate([ { $lookup: { from: "reply", localField: "_id", foreignField: "commentid", as: "reply" } }, { $lookup: { from: "service_provider_signed_money", localField: "userid", foreignField: "user_id", as: "money" } } ]) |
看看我的示例:
这里我会先创建两个表:Reply(回复表)
@Data @NoArgsConstructor @AllArgsConstructor @Document(collection="reply") public class Reply { @Id private String _id; private String contentTxt; private String userid; private String parentid; private String createdatetime; //原因 private String reason; //评论id private String commentid; } |
Comment(评论表)
@Data @NoArgsConstructor @AllArgsConstructor @Document(collection="comment") public class Comment implements Serializable { @Id private String _id; private String articleid; private String content; private String userid; private String nickname; private String createdatetime; private Integer likenum; //点赞数 private Integer replynum;//回复数 private Integer state; //状态 private String parentid; } |
返回参数类:
@Data public class ReplyCommentDto {
private String _id; private String articleid; private String content; private String userid; private String nickname; private String createdatetime; private Integer likenum; //点赞数 private Integer replynum;//回复数 private Integer state; //状态 private String parentid; //对应上面的回复表 private Reply reply; } |
Java 代码:
@Override public List<ReplyCommentDto> getReplyComment(String content, int pageNum, int pageSize) { // 构建 Aggregation:添加查询条件 Aggregation aggregation = Aggregation.newAggregation( // 关联member表 Aggregation.lookup( "reply", // 从表表名 "_id", // 如comment被查询主表的_id,相对于reply表的外键 "commentid", // 如reply从表的外键commentid,相对于comment表的主键 "reply" // 联合查询出的别名,用于多条件查询表明前缀,相当于SQL中的临时表名 ), // ============================================= 以上内容可举一反三 ======================= // 查询条件 null == content || "".equals(content.trim()) ? Aggregation.match( Criteria.where("content").nin("") // 店铺状态: 1:已审核 // 添加member表查询条件,如用户手机号,此处可举一反三 ) : Aggregation.match( Criteria.where("content").regex(content)
), // 分页:页码 Aggregation.skip(Long.valueOf(pageNum)), // 分页:条数 Aggregation.limit((long) pageSize), // 排序 Aggregation.sort(Sort.Direction.DESC,"createdatetime") ); // 执行查询,这里的shop必须是查询的主表名 AggregationResults<ReplyCommentDto> results = mongoTemplate. aggregate(aggregation, "comment", ReplyCommentDto.class); return results.getMappedResults(); }
|
注意:
mongodb 字段类型 问题 主键 默认为:对象id 字段类型不一致可能会导致查不出来