【问题标题】:How to get distinct value of sub document field with their count in collection in mongodb?如何在 mongodb 的集合中获取子文档字段的不同值?
【发布时间】:2014-12-13 02:40:15
【问题描述】:

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

例子:

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的聚合框架得到这个输出吗,如果可以,那怎么做? -- 高优先级

【问题讨论】:

    标签: node.js mongodb


    【解决方案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
    });
    

    【讨论】:

      猜你喜欢
      • 2013-07-12
      • 1970-01-01
      • 2014-11-12
      • 1970-01-01
      • 2023-01-31
      • 1970-01-01
      • 1970-01-01
      • 2016-10-21
      • 2019-01-17
      相关资源
      最近更新 更多