我正在使用MongoDB版本2.6.5,我有一个看起来像这样的集合:
{
"_id": ObjectId("555a3398f4c572a44f877dcd"),
"created": ISODate("2015-05-18T17:02:14.951Z"),
"values": [
{
"value": "4",
"label": "Apple"
},
{
"value": "5",
"label": "Peach"
},
{
"value": "5",
"label": "Banana"
},
{
"value": "4",
"label": "Orange"
}
],
"__v": 0
}
{
"_id": ObjectId("555a74dbdfe135105faccdf7"),
"created": ISODate("2015-05-18T21:27:37.064Z"),
"values": [
{
"value": "2",
"label": "Apple"
},
{
"value": "3",
"label": "Peach"
},
{
"value": "4",
"label": "Banana"
},
{
"value": "5",
"label": "Orange"
}
],
"__v": 0
}
{
"_id": ObjectId("555a74f9dfe135105faccdfa"),
"created": ISODate("2015-05-18T21:27:37.064Z"),
"values": [
{
"value": "1",
"label": "Apple"
},
{
"value": "1",
"label": "Peach"
},
{
"value": "1",
"label": "Banana"
},
{
"value": "1",
"label": "Orange"
}
],
"__v": 0
}
当我尝试获取values.label
为“橙色”且values.value
为“5”的文档时,我应该收回一份文档,但我得到两份:
> db.answers.count({ 'values.label':'Orange', 'values.value':'5' })
> 2
这是选择带有ID的两个文档:555a3398f4c572a44f877dcd
(可能是因为Banana
的值也是5)和555a74dbdfe135105faccdf7
(这是唯一正确的)。谁能想到为什么会这样?
答案 0 :(得分:7)
您正在使用阵列上的dot notation(用于访问对象)。虽然它以您描述的方式工作,但它确实意味着OR逻辑,因为整个数组被解释为一个对象,可以这么说。
您希望匹配数组中文档的多个条件,这是$elemMatch
operator的用途,即
db.answers.count({ 'values' : { '$elemMatch' : { 'label':'Orange', 'value':'5' } } })