MongoDB:特定子文档所有字段的聚合值

MongoDB:特定子文档所有字段的聚合值,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我尝试使用MongoDB的聚合框架从具有以下结构的集合生成文档: { "_id" : ObjectId("5510eb56f877bbef153d236d"), "attributes" : { "brand" : "Mercedes", "price" : 289, "family" : "GARDEN" }, "name" : "Bigger Fix Soft Crisps" } { "_id" : ObjectId("5510eb56f877bb

我尝试使用MongoDB的聚合框架从具有以下结构的集合生成文档:

{
  "_id" : ObjectId("5510eb56f877bbef153d236d"),
  "attributes" : {
    "brand" : "Mercedes",
    "price" : 289,
    "family" : "GARDEN"
  },
  "name" : "Bigger Fix Soft Crisps"
}
{
  "_id" : ObjectId("5510eb56f877bbef153d236e"),
  "attributes" : {
    "brand" : "Adelholzener",
    "price" : 683,
    "family" : "COMPUTER"
  },
  "name" : "Soft Stockhome Chips"
}
{
  "_id" : ObjectId("5510eb56f877bbef153d236f"),
  "attributes" : {
    "brand" : "Pepsi",
    "price" : 789,
    "family" : "CAR"
  },
  "name" : "Light Yearsailfresh Meat"
}
我想获得
属性
子文档中所有字段及其可能值的聚合。由于子文档中的字段未知,我不能简单地使用本例中给出的字段,因此必须是动态的。结果应该与此类似:

{
  "_id" : "brand",
  "values" : [
    "Mercedes", "Adelholzener", "Pepsi"
  ]
},
{
  "_id" : "price",
  "values" : [
    289, 683, 789
  ]
},
{
  "_id" : "family",
  "values" : [
    "GARDEN", "COMPUTER", "CAR"
  ]
}

到目前为止,我还没有找到解决这个问题的方法。我尝试了
$project
$unwind
(这显然只适用于数组)。

试图找出如何通过聚合来实现这一点,但我不确定这是否可行,因为您无法以任何好的方式获得对象中的键

下面是一个MapReduce作业,它可以完成以下任务:

db.runCommand({
“mapreduce”:“test_collection”,//在此处更改集合
“map”:函数(){
for(此.attributes中的var键){
//发射带有数组的对象,因为我们不能直接减少数组
emit(键,{x:[this.attributes[key]]});
}
},
“reduce”:函数(键、值){
var-res=[];
值。forEach(函数(d){
Array.prototype.push.apply(res,d.x);
});
返回{x:res};
}, 
“finalize”:功能(键,reducedVal){
返回reducedVal.x;
},
“out”:{inline:1}
});

你能介绍一下这个系列吗?可能你应该使用三个单独的聚合来找出
品牌
价格
系列
,其他明智的使用地图还原方法这确实有效,但正如你所说的,可能没有很好的方法来获取对象的密钥。非常感谢。