嵌套$和/或分组$和MongoDB

时间:2013-03-04 13:24:24

标签: mongodb

考虑以下文件:

{
    "_id" : ObjectId("5130f9a677e23b11503fee55"),
    "ItemType" : "Bicycle"
     "Attributes" : [{
         "AttributeName" : "Spare Tire",
         "AttributeValue" : "1"
     }, {
         "AttributeName" : "With helmet?",
         "AttributeValue" : "0"
     }, {
         "AttributeName" : "Number of Locks",
         "AttributeValue" : "1"
     }]
}

如何编写查询以获取备有轮胎且没有头盔的自行车

我尝试了以下但是没有给我我想要的东西。

{ 
"$and" : 
[ 
    { "ItemType" : "Bicycle" }, 
    { "$and": 
        [{ "Attributes.AttributeName" : "With helmet?" }, 
         { "Attributes.AttributeValue" : "0" }
   ]},
    { "$and": 
        [{ "Attributes.AttributeName" : "Spare Tire" }, 
         { "Attributes.AttributeValue" : "1" }
   ]}
]}

似乎只要有一个匹配Attributes.AttributeValue的值 - 无论伴随Attributes.AttributeName - 然后它返回该文档。这就像有这个查询:

{ 
"$and" : 
[ 
    { "ItemType" : "Bicycle" },                        //true
    { "Attributes.AttributeName" : "With helmet?" },   //true 
    { "Attributes.AttributeName" : "Spare Tire" },     //true
    { "Attributes.AttributeValue" : "0" },             //any
    { "Attributes.AttributeValue" : "1" }              //any
]}

1 个答案:

答案 0 :(得分:3)

我相信您在这里寻找$elemMatch,从而确保对应的AttributeNameAttributeValue位于多值字段的同一元素中{{3} }):

{
    ItemType: 'Bicycle', 
    $and:[
        {"Attributes": {$elemMatch:{AttributeName: 'With helmet?', AttributeValue: 0 }}},
        { //Next match }
    ]
}

尝试类似的东西