在mongodb中添加聚合中的条件和组函数

时间:2014-09-26 05:36:19

标签: mongodb mongodb-query aggregation-framework

我有mongo模型让我们说 MYLIST 包含如下数据: -

{ 
    "_id" : ObjectId("542139f31284ad1461dbc15f"),
    "Category" : "CENTER",
    "Name" : "STAND",
    "Url" : "center/stand", 
    "Img" : [ { 
         "url" : "www.google.com/images", 
         "main" : "1", 
         "home" : "1", 
         "id" : "34faf230-43cf-11e4-8743-311ea2261289" 
    },
      { 
         "url" : "www.google.com/images1", 
         "main" : "1", 
         "home" : "0", 
         "id" : "34faf230-43cf-11e4-8743-311e66441289" 
    } ]
}

我对 MYLIST 集合执行以下查询:

db.MYLIST.aggregate([
    { "$group": { 
        "_id": "$Category", 
        "Name": { "$addToSet": { 
            "name": "$Name",
            "url": "$Url",
            "img": "$Img"
        }}
    }},
    { "$sort": { "_id" : 1 } }
]);

我得到了以下结果 -

[ 
     {  _id: 'CENTER',
     Name: 
     [ { "name" : "Stand", 
          "url" : "center/stand", 
    "img":                                                                                                                 { "url" : "www.google.com/images" , "main" : "1", "home" : "1", "id" : "350356a0-43cf-11e4-8743-311ea2261289" } 
      }] 
     },
     {  _id: 'CENTER',
     Name: 
     [ { "name" : "Stand", 
          "url" : "center/stand", 
    "img":                                                                                                                 { "url" : "www.google.com/images1" , "main" : "1", "home" : "0", "id" : "34faf230-43cf-11e4-8743-311ea2261289" } 
      }] 
     }
    ]

正如您所看到的,img密钥本身是对象数组,因此我在img数组中为每个条目的相同类别获取多个条目。< / p>

我真正需要的是只获取那些具有home键值的图像。 预期结果: -

[ 
     {  _id: 'CENTER',
     Name: 
     [ { "name" : "Stand", 
          "url" : "center/stand", 
    "img":                                                                                                                 { "url" : "www.google.com/images" , "main" : "1", "home" : "1", "id" : "350356a0-43cf-11e4-8743-311ea2261289" } 
      }] 
     },
    ] 

因此,我想在上述查询中添加img.home > 0的条件,有人可以帮我解决这个问题,因为我是MongoDB的新手。

1 个答案:

答案 0 :(得分:1)

仍然不确定这是否是您想要的,或者甚至为什么要在此分组上使用$addToSet。但是,如果您只想“过滤”结果中返回的数组内容,那么在处理$match管道后,您要做的是$unwind数组元素“去标准化”内容:

db.MYLIST.aggregate([
    // If you only want those matching array members it makes sense to match the 
    // documents that contain them first
    { "$match": { "Img.home": 1 } },

    // Unwind to de-normalize or "un-join" the documents
    { "$unwind": "$Img" },

    // Match again to "filter" out those elements that do not match
    { "$match": { "Img.home": 1 } },

    // Then do your grouping
    { "$group": { 
        "_id": "$Category", 
        "Name": { 
            "$addToSet": { 
                "name": "$Name",
                "url": "$Url",
                "img": "$Img"
            }
        }
    }},

    // Finally sort
    { "$sort": { "_id" : 1 } }
]);

因此$match管道在SQL术语中等同于一般查询或“where子句”,并且可以在任何阶段使用。当由此产生某种类型的过滤时,通常最好将其作为第一阶段。它通过减少要处理的文档来减少总体负载,即使没有删除“全部”最终结果,就像使用数组一样。

$unwind阶段允许像处理另一个文档一样处理数组元素。当然,您可以在此之后使用另一个$match管道阶段,以便将文档与查询条件匹配。