如何在SubDocument数组上使用elemMatch进行搜索?我有一个名为ReportCollection的文档,其中包含以下元素: -
/* 0 */
{
"_id" : ObjectId("5507bfc435e9470c9aaaa2ac"),
"owner" : ObjectId("5507bfc31e14d78e177ceebd"),
"reports" : {
"xReport" : [
{
"name" : "xReport",
"parameters" : {
"x" : {
"dateTime" : "2015-03-11T18:30:00.000Z",
"unit" : 1,
"value" : 102
}
},
"createdBy" : ObjectId("5507bfc31e14d78e177ceebd"),
"modifiedBy" : ObjectId("5507bfc31e14d78e177ceebd"),
"_id" : ObjectId("5507bfc41e14d78e177ceebf")
}
]
}
}
我将reports.xReport [] ._ id作为搜索参数。
我的以下尝试失败了: -
db.reports.find ({ {owner: ObjectId("5507afd3d54bae3513c185cb")},
{ 'reports.xReport': {$elemMatch: {_id: ObjectId("5507afd3d54bae3513c185cd") }}} } )
答案 0 :(得分:4)
您似乎正在尝试将工作放入您应该在查询中执行的“投影”中。相反,你的陈述应该更像这样:
db.reports.find(
{
"owner": ObjectId("5507bfc31e14d78e177ceebd"),
"reports.xReport._id": ObjectId("5507bfc41e14d78e177ceebf")
},
{ "reports.xReport.$": 1 }
)
所以“查询”执行匹配数组位置的工作,“投影”只是在匹配中使用该位置。
另请注意,您永远不需要$elemMatch
与单个字段匹配。只有在条件中需要多个字段时,您才需要使用它来匹配特定的“元素”。
出于同样的原因,这也应该在“查询”语句中。
其中投影形式的 $elemMatch
不能与子文档字段一起用点分表示法。