1

我有收藏

[
    {
        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
        }
    }
}

谢谢

4

2 回答 2

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:  {}
                }
            }
        }
    }
)
于 2013-05-21T08:21:20.900 回答
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.height 中有多少个 1 和 3 以及 data.width 中有多少个 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}]}]}}
于 2013-05-22T04:31:10.300 回答