如何在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的总体框架得到这个输出,如果是的话,那么如何? – 高优先级

是的, 聚合可以做到。

 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 });