在SpringData MongoDb中查询嵌套对象

时间:2014-10-10 01:29:10

标签: 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:00:00Z"),
      "title" : "Stuff"
    }]
}

这个文档看起来很好,它是由2个类SpeakerTalk生成的,当它们都没有任何注释时,前者有一个列表作为属性。

我需要获得的是具有特定名称的谈话清单。 这就是我要做的事情:

BasicQuery query = new BasicQuery("{'talks.title' : 'Stuff'}");

此操作因org.springframework.data.mapping.model.MappingException: Invalid path reference talks.title! Associations can only be pointed to directly or via their id property!

而失败

我想它不能使用Id属性(因为Talk对象没有它自己的id),我不知道可以直接指向'意味着' 39;

我的查询和/或映射有什么问题?

1 个答案:

答案 0 :(得分:1)

关于错误,您必须提供更多详细信息:抛出错误的确切调用,SpringData版本,MongoDB版本。

您构建的查询似乎没问题,但它不会返回Talk个对象,而是会返回至少有一个“Stuff”对话的Speaker个对象。

如果您只想获得一个具有特定标题的Talk,您可以使用带有投影的查找

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