Mongo找到一个带投影的子文档

时间:2015-07-22 11:24:08

标签: mongodb

当我尝试查找特定的子文档时遇到了一个奇怪的问题。例如,我有一个名为" 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"
  }]
}

是查询的预期结果吗?为什么我得到第一个子文档而不是第二个子文档,同时第一个子文档分数与查询中的分数不一样?

1 个答案:

答案 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需要在同一个“元素”上满足“两个”条件,而不仅仅对文档有效。所以它是“查询”中的“查询”,这就是你得到结果的方式。

相关问题