我使用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;}
II.第二个文件是“工具”
document("tools")class Tooldocument { @ID private String ID; private String name; private String madeInCountry; private String madeInYear; private List
III.第三个是嵌入式模型“UsedIn”(ii.)
第三个嵌入式模型表示在制造厂中用于制造汽车的工具的位置.
class UsedIn { @DBRef private Cardocument car; private DateTime usedDate; private String usedByUsername;}
我的DAO如下:
public interface CarDAO extends MongoRepository
现在我需要列出特定汽车中使用的所有“工具”.
说
一个.汽车制造时在国内:“德国”和
湾工具制造国家:“德国”
我看到我们无法直接在DBRef文档上应用搜索.
喜欢 :
String madeInCountry = "germany";toolDAO.findByMadeInCountryAndUsedInCarMadeInCountry(madeInCountry,madeInCountry);
我收到此错误:
"InvalID path reference car.madeInCountry! Associations can only be pointed to directly or via their ID property!"
怎么样?
我需要做两个DAO呼叫吗?
说
一世.首先让所有带有madeInCountry的汽车都是德国的
String madeInCountry = "germany";carDAO.findByMadeInCountry(madeInCountry);
II. findTools由cardocuments和String列表组成.
我不知道,如何用Cardocuments和madeInCountry字符串列表调用这个dao?
我需要使用一些$lookup功能吗?
谢谢
最佳答案您可以尝试以下聚合.将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的调用以及汽车文档列表值.查询将查找匹配项,并在找到工具文档的匹配项时返回所有汽车文档.这意味着您将获得德国制造的工具文件,其中至少使用了德国制造的文件.
分片更新($lookup equalivent)(从这里获取的想法MongoDB to Use Sharding with $lookup Aggregation Operator)
List
总结 以上是内存溢出为你收集整理的java – spring-data-mongodb:findAll(),包含输入文档列表和嵌入式DBRef文档的搜索参数全部内容,希望文章能够帮你解决java – spring-data-mongodb:findAll(),包含输入文档列表和嵌入式DBRef文档的搜索参数所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)