目的是要实现类似sql的join操作
参考$lookup
public class OrderQsDemographicSize {
@Id
private String id;
private String demographic;
private List<String> sizes;
private ObjectId userId;
private String realname;//这个是用来lookup(join)的
......getter setter......
public class User {
@Id
private String id;
private String name;
@Field("pass")
private String password;
private String realname;
要实现sql=select s.*,u.realname from orderQsDemographicSize s left join user u on u.id=s.userId 功能
import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;//要记得import
@Autowired
MongoTemplate MongoTemplate;
......
//设置lookup
LookupOperation lookupOperation = LookupOperation.newLookup().from("user").localField("userId").foreignField("_id").as("userDoc");
//这里分三个部分,先lookup;结果再用project筛选,如果不筛选user里面所有内容,包括密码都会输出;最后sort排序
Aggregation aggregation = newAggregation(
lookupOperation,
project("id", "demographic", "sizes", "userDoc.realname"),
sort(Sort.Direction.ASC, "demographic")
);
///////////////////
logger.debug(aggregation.toString());//看具体的查询,有助于理解各个参数的影响
//正式查询
List<OrderQsDemographicSize> list = MongoTemplate
.aggregate(aggregation, "orderQsDemographicSize", OrderQsDemographicSize.class).getMappedResults();
由于mongo可多级扩展的特性,需要join的操作实际上大大减少了,然而多个表共用的数据还是难免需要join。虽然要多写几行代码,用熟了也不觉得麻烦。