我有收藏品
[
{
data: {
height: 1,
width: 2
}
},{
data: {
height: 3,
width: 2
}
},{
data: {
height: 3,
width: 1
}
}
]
如何计算data.height中的1和3以及data.width中的1和2?基本上我需要像
这样的结果{
data: {
haight: {
"1": 1,
"3": 2
},
width: {
"1": 1,
"2": 2
}
}
}
由于
答案 0 :(得分:1)
现在我用mapReduce得到了我需要的东西,它是“范围”参数
db.myCollection.mapReduce(
function(){
if( this.data.height in res.data.height === false ) res.data.height[this.data.height] = 0;
if( this.data.width in res.data.width === false ) res.data.width[this.data.width] = 0;
res.data.height[this.data.height]++;
res.data.width[this.data.width]++;
emit('id', 1);
},
function(){
return res;
},
{
out: {inline: 1},
scope: {
res: {
data:{
height: {},
width: {}
}
}
}
}
)
答案 1 :(得分:0)
如何计算data.height中的1和3以及data.width中的1和2?
可以单独聚合每个值(如其他答案所示)。或者,您可以使用单个命令聚合这两个值:
db.test.aggregate({$group: {_id: "$data.height", width: {$push: "$data.width"}, heightCount: {$sum: 1}}},
{$project: {height: {id: "$_id", count: "$heightCount"}, width: 1}},
{$unwind: "$width"},
{$group: {_id: "$width", widthCount: {$sum: 1}, height: {$addToSet: "$height"}}},
{$unwind: "$height"},
{$group: {_id: null, width: {$addToSet: {id: "$_id", count: "$widthCount"}}, height: {$addToSet: "$height"}}})
我如何计算data.width中数据中的 1和3以及数据中的1和2
如果您只想在data.height中聚合 1和3,在data.width 中聚合1和2,那么您可以将以下命令放在管道的开头:
{$match: {$and: [{$or: [{"data.width": 1}, {"data.width": 2}]}, {$or: [{"data.height": 1}, {"data.height": 3}]}]}}