MongoDB:特定子文档所有字段的聚合值
我尝试使用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
{
"_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}
});
你能介绍一下这个系列吗?可能你应该使用三个单独的聚合来找出品牌
、价格
和系列
,其他明智的使用地图还原方法这确实有效,但正如你所说的,可能没有很好的方法来获取对象的密钥。非常感谢。