如何在mongodb中获取子文档字段的明确值及其在集合中的计数?

时间:2014-10-17 13:36:51

标签: node.js mongodb

我有一个包含如下文档的集合。我想获取属性名称子文档的所有不同值及其不同的值和集合中的计数。

示例:

var records  = [
     {
        "attributes": [
            {
                "name": "color",
                "value": "black",
                "_id": "5441103a0348ebc91ee75b33"
            }
        ],
        "name": "ddd"
    },
    {
        "attributes": [
            {
                "name": "color",
                "value": "red",
                "_id": "5441091393450f1619be99af"
            },
            {
                "name": "size",
                "value": "L",
                "_id": "5441091393450f1619be99b0"
            }
        ],
        "name": "one"
    },
    {

        "attributes": [
            {
                "name": "color",
                "value": "black",
                "_id": "5441092593450f1619be99b1"
            },
            {
                "name": "size",
                "value": "L",
                "_id": "5441092593450f1619be99b2"
            }
        ],

        "name": "sdfsda"
    },
    {
        "attributes": [
            {
                "name": "color",
                "value": "green",
                "_id": "5441093d93450f1619be99b3"
            },
            {
                "name": "size",
                "value": "S",
                "_id": "5441093d93450f1619be99b4"
            }
        ],
        "name": "threee"
    },
    {
        "attributes": [
            {
                "name": "color",
                "value": "green",
                "_id": "5441095793450f1619be99b5"
            },
            {
                "name": "size",
                "value": "M",
                "_id": "5441095793450f1619be99b6"
            }
        ],
        "name": "one"
    }

]

我希望输出如下:

var output =  
   {
     "color" : [
           {value : 'red', count : 1}
           {value : 'black', count : 2}
           {value : 'green', count : 2}
         ],
     "size" : [
          {value : 'S', count : 2}
          {value : 'L', count : 1}
          {value : 'M', count : 1}
      ]
  }

如何在mongodb中获得此输出?

我可以通过mongodb的聚合框架获得此输出,如果是,那么如何? - 高优先级

1 个答案:

答案 0 :(得分:1)

是的,聚合可以成功。

var output = {};

db.c.aggregate([{
    $unwind : "$attributes"
}, {
    $group : {
        _id : {
            name : "$name",
            value : "$value"
        },
        count : {
            $sum : 1
        }
    }           // the output after this stage such as 
                // {_id:{name:"color", value:"green"}, count:2}
                // {_id:{name:"size", value:"S"}, count:2}
}, {
    $group : {
        _id : "$_id.name",
        contents : {
            $push : {
                value : "$_id.value",
                count : "$count"
            }
        }
    }           // the output after this stage such as 
                // {_id:"color", contents:[{value:"green", count:2}]}
                // {_id:"size", contents:[{value : 'S', count : 2}]}
}]).forEach(function(doc) {
    output[doc._id] = doc.contens;  // just convert to the format as expected
});