当我尝试查找特定的子文档时遇到了一个奇怪的问题。例如,我有一个名为" test"文档看起来像:
{
"_id": ObjectId("55af71b52028d8a365430fcd"),
"sub": [{
"name": "A",
"type": "2",
"score": "10"
}, {
"name": "B",
"type": "2",
"score": "9"
}]
}
当我尝试使用db.getCollection('test').find({"sub.score" : "9","sub.type" : "2"},{"sub.$" :1})
之类的查询来查找第二个子文档时,我得到了第一个子文档
{
"_id": ObjectId("55af71b52028d8a365430fcd"),
"sub": [{
"name": "A",
"type": "2",
"score": "10"
}]
}
是查询的预期结果吗?为什么我得到第一个子文档而不是第二个子文档,同时第一个子文档分数与查询中的分数不一样?
答案 0 :(得分:0)
在此获得您想要的内容的答案是使用$elemMatch
:
db.getCollection('test').find(
{
"sub": { "$elemMatch": { "score" : "9","type" : "2"} }
},
{ "sub.$": 1 }
)
产生:
{
"_id" : ObjectId("55af71b52028d8a365430fcd"),
"sub" : [
{
"name" : "B",
"type" : "2",
"score" : "9"
}
]
}
为什么?
因为当您将“both”属性作为“查询”的条件引用时,这些属性只是在数组中查找“any”匹配。投影中使用的positional $
运算符的规则是“第一个”匹配是显示的匹配。
在这种情况下,"sub.type": 2
匹配数组的第一个索引项以及第二个索引项。因此,匹配的第一个“第一个”索引(第一个元素)是返回的索引。
另一方面,$elemMatch
需要在同一个“元素”上满足“两个”条件,而不仅仅对文档有效。所以它是“查询”中的“查询”,这就是你得到结果的方式。