2014-10-17 52 views
1

我有一个像下面这样的文档的集合。我想要获取属性子文档名称的所有不同的值,以及它们的不同值并计入集合中。如何在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

是的,总计可以做到这一点。

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 
}); 
相关问题