在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?)
     )