您可以尝试以下聚合.
将UsedIn类更新为以下.
private Long carId;
private CarDocument car;
private Date usedDate;
private String usedByUsername;
Mongo Shell查询:
db.tools.aggregate([{
"$match": {
"madeInCountry": "germany"
}
},{
"$unwind": "$usedIn"
},{
"$lookup": {
"from": "cars","localField": "usedIn.carId","foreignField": "_id","as": "usedIn.car"
}
},{
"$unwind": "$usedIn.car"
},{
"$match": {
"usedIn.car.madeInCountry": "germany"
}
},{
"$group": {
_id: "$_id",usedIns: {
"$push": "$usedIn"
}
}
}])
Spring聚合代码:
Criteria toolQuery = Criteria.where("madeInCountry").in("germany");
MatchOperation toolMatchOperation = new MatchOperation(toolQuery);
LookupOperation lookupOperation = LookupOperation.newLookup().
from("cars").
localField("usedIn.carId").
foreignField("_id").
as("usedIn.car");
Criteria carQuery = Criteria.where("usedIn.car.madeInCountry").is("germany");
MatchOperation carMatchOperation = new MatchOperation(carQuery);
TypedAggregation
加载数据的方法.
汽车数据
public void saveCar() {
carDao.deleteAll();
CarDocument carDocument1 = new CarDocument();
carDocument1.setId(1L);
carDocument1.setName("audi");
carDocument1.setMadeInCountry("germany");
carDao.save(carDocument1);
}
工具数据
public void saveTool() {
toolDao.deleteAll();
ToolDocument toolDocument1 = new ToolDocument();
toolDocument1.setId(1L);
toolDocument1.setName("wrench");
toolDocument1.setMadeInCountry("germany");
UsedIn usedIn1 = new UsedIn();
usedIn1.setCarId(1L);
usedIn1.setUsedByUsername("user");
usedIn1.setUsedDate(new Date());
List
更新:
回答有关访问DBRef的问题
ii. findTools by the list of carDocuments and String.
I dont know,how to call this dao with list of CarDocuments and
madeInCountry String ?
public List
就像我在第一个评论中提到的那样,您需要的第二个调用是对嵌入式dbref的调用以及汽车文档列表值.查询将查找匹配项,并在找到工具文档的匹配项时返回所有汽车文档.这意味着您将获得德国制造的工具文件,其中至少使用了德国制造的文件.
List