如何使用MongoDB中的多表关联查询($lookup) 示例

简单了解下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 字段类型不一致可能会导致查不出来
posted @ 2021-11-26 10:24  星空物语之韵  阅读(1627)  评论(0编辑  收藏  举报