我需要在我的文档中询问有关嵌套对象状态的问题,如下所示:
{
"_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个类Speaker
和Talk
生成的,当它们都没有任何注释时,前者有一个列表作为属性。
我需要获得的是具有特定名称的谈话清单。 这就是我要做的事情:
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;
我的查询和/或映射有什么问题?
答案 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?)
)