在SpringData MongoDb中查询嵌套对象
我需要问一个关于文档中嵌套对象状态的问题,如下所示:在SpringData MongoDb中查询嵌套对象,mongodb,spring-data,spring-data-mongodb,Mongodb,Spring Data,Spring Data Mongodb,我需要问一个关于文档中嵌套对象状态的问题,如下所示: { "_id" : ObjectId("5437248f2dfbc82fcafa9733"), "_class" : "conference.Speaker", "speakerId" : NumberLong(0), "name" : "John Doe", "talks" : [{ "talkId" : NumberLong(0), "when" : ISODate("2014-10-17T15
{
"_id" : ObjectId("5437248f2dfbc82fcafa9733"),
"_class" : "conference.Speaker",
"speakerId" : NumberLong(0),
"name" : "John Doe",
"talks" : [{
"talkId" : NumberLong(0),
"when" : ISODate("2014-10-17T15:00:00Z"),
"title" : "Stuff"
}]
}
此文档看起来不错,它是由两个类生成的,Speaker
和Talk
,它们都没有任何注释,并且前者有一个later列表作为属性
我需要的是一份有特定名字的谈话清单。
以下是我想做的:
BasicQuery query = new BasicQuery("{'talks.title' : 'Stuff'}");
此操作失败,原因是org.springframework.data.mapping.model.MappingException:无效的路径引用talks.title!只能直接或通过其id属性指向关联代码>
我猜它不能使用Id属性(因为Talk对象没有自己的Id),我也不知道“可以直接指向”是什么意思
我的查询和/或映射有什么问题?关于错误,您必须提供更多详细信息:引发错误的确切调用,SpringData版本,MongoDB版本
您构建的查询看起来不错,但它不会返回Talk
对象,而是返回至少有一个“Stuff”Talk的Speaker
对象
如果您只想获得一个具有特定标题的演讲,可以使用带有投影的查找:
如果您希望所有对话与标题匹配,则必须使用聚合:
我猜这是因为谈话是一个数组。要直接指出,应该是talks.index.title
(index=0,1,…)——当然,这种风格超出了您的预期。另一种方法是:queryquery=newquery().addCriteria(Criteria.where(“talks.title”).is(“Stuff”)代码>。不知道这是不是你想要的。
db.talks.find({"talks.title":"Stuff"}, { talks: { $elemMatch: { title: "Stuff" } } })
db.talks.aggregate(
// match only speaker with 'Stuff talks'
{ $match : {
"talks.title": "Stuff"
}},
{ $unwind : "$talks" },
{ $match : {
"talks.title": "Stuff"
}},
// projection (only talks fields?)
)