vir*_*sha 6 java spring mongodb spring-data-mongodb
我使用spring-data-mongo并尝试使用params访问dbref对象.我的项目看起来像这样:
我的模型如下:
一世.第一份文件是"汽车"
@Document("cars")
class CarDocument {
@Id
private String id;
private String name;
private String madeInCountry;
private String model;
private String madeInYear;
}
Run Code Online (Sandbox Code Playgroud)
II.第二个文件是"工具"
Document("tools")
class ToolDocument {
@Id
private String id;
private String name;
private String madeInCountry;
private String madeInYear;
private List<UsedIn> usedIn = new ArrayList<>();
}
Run Code Online (Sandbox Code Playgroud)
III.第三个是(ii.)中的嵌入式模型"UsedIn".第三个嵌入式模型表示工具用于在制造厂中制造汽车的位置.
class UsedIn {
@DBRef
private CarDocument car;
private DateTime usedDate;
private String usedByUsername;
}
Run Code Online (Sandbox Code Playgroud)
我的DAO如下:
public interface CarDAO extends MongoRepository<CarDocument, String>
{
public CarDocument findByMadeInCountry(String madeInCountry);
}
public interface ToolDAO extends MongoRepository<ToolDocument, String>
{
public ToolDocument findByMadeInCountry(String madeInCountry);
}
Run Code Online (Sandbox Code Playgroud)
现在我需要列出特定汽车中使用的所有"工具".说一个.汽车制造时在国内:"德国"和b.工具制造国家:"德国"
我看到我们无法直接在DBRef文档上应用搜索.喜欢 :
String madeInCountry = "germany";
toolDAO.findByMadeInCountryAndUsedInCarMadeInCountry(madeInCountry,madeInCountry);
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
"Invalid path reference car.madeInCountry! Associations can only be pointed to directly or via their id property!"
Run Code Online (Sandbox Code Playgroud)
怎么样?
我需要做两个DAO呼叫吗?说我.首先让所有带有madeInCountry的汽车都是德国的
String madeInCountry = "germany";
carDAO.findByMadeInCountry(madeInCountry);
Run Code Online (Sandbox Code Playgroud)
II.findTools由carDocuments和String列表组成.
我不知道,如何用CarDocuments和madeInCountry字符串列表调用这个dao?
我需要使用一些$ lookup功能吗?
谢谢
您可以尝试下面的聚合。
将您的班级更新UsedIn
为以下内容。
private Long carId;
private CarDocument car;
private Date usedDate;
private String usedByUsername;
Run Code Online (Sandbox Code Playgroud)
蒙戈外壳查询:
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"
}
}
}])
Run Code Online (Sandbox Code Playgroud)
春季聚合代码:
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<ToolDocument> aggregation = Aggregation.newAggregation(ToolDocument.class, toolMatchOperation, Aggregation.unwind("usedIn"), lookupOperation, Aggregation.unwind("usedIn.car"), carMatchOperation,
Aggregation.group("id").push("usedIn").as("usedIn"));
List<ToolDocument> results = mongoTemplate.aggregate(aggregation, ToolDocument.class).getMappedResults();
Run Code Online (Sandbox Code Playgroud)
加载数据的方法。
汽车数据
public void saveCar() {
carDao.deleteAll();
CarDocument carDocument1 = new CarDocument();
carDocument1.setId(1L);
carDocument1.setName("audi");
carDocument1.setMadeInCountry("germany");
carDao.save(carDocument1);
}
Run Code Online (Sandbox Code Playgroud)
刀具数据
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<UsedIn> usedIns1 = new ArrayList<>();
usedIns1.add(usedIn1);
toolDocument1.setUsedIn(usedIns1);
toolDao.save(toolDocument1);
}
Run Code Online (Sandbox Code Playgroud)
更新:
回答有关访问 DBRefs 的问题
二. findTools 通过 carDocuments 和 String 列表。
我不知道如何使用 CarDocuments 和 madeInCountry String 列表调用此 dao ?
public List<ToolDocument> findByMadeInCountryAndUsedInCarIn(String madeInCountry, List<CarDocument> carDocuments);
Run Code Online (Sandbox Code Playgroud)
就像我在第一条评论中指出的那样,您需要的第二个调用是对带有汽车文档值列表的嵌入式 dbref 的调用。该查询将查找匹配项,并在找到工具文档的匹配项时返回所有汽车文档。这意味着您将获得德国制造的工具文档,其中至少有一个用于德国制造的汽车文档。
分片更新($lookup
equalivent)(想法取自这里MongoDB to Use Sharding with $lookup Aggregation Operator)
List<ToolDocument> toolDocuments = toolDao.findByMadeInCountry("germany");
List<Long> carIds = toolDocuments.stream().map(tool -> tool.getUsedIn().stream().map(UsedIn::getCarId).collect(Collectors.toList())).flatMap(List::stream).collect(Collectors.toList());
List<CarDocument> carDocuments = carDao.findByMadeInCountryAndIdIn("germany", carIds);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1383 次 |
最近记录: |