如何通过两个单独的标准确保分组

时间:2014-01-01 04:38:11

标签: mongodb

How to average the summed up values in mongodb?

扩展

使用MongoDB 2.4.8,

我有以下记录

{
    "category" : "TOYS",
    "price" : 12,
    "status" : "online",
    "_id" : "35043"
}
{
    "category" : "TOYS",
    "price" : 13,
    "status" : "offline",
    "_id" : "35044"
}
{
    "category" : "TOYS",
    "price" : 22,
    "status" : "online",
    "_id" : "35045"
}
{
    "category" : "BOOKS",
    "price" : 13,
    "status" : "offline",
    "_id" : "35046"
}
{
    "category" : "BOOKS",
    "price" : 17,
    "status" : "online",
    "_id" : "35047"
}
{
    "category" : "TOYS",
    "price" : 19,
    "status" : "unavailable",
    "_id" : "35048"
}
{
    "category" : "BOOKS",
    "price" : 10,
    "status" : "unavailable",
    "_id" : "35049"
}
{
    "category" : "BOOKS",
    "price" : 17,
    "status" : "unavailable",
    "_id" : "35050"
}

我想查找状态为在线或离线的所有类别的平均价格,并且某个类别的总价格超过50个。

离线玩具和玩具在线被视为两个独立的类别。

我改编了答案。

db.items.aggregate([
    {$match:
        {    
            $or: [       
              {status:"online"},
              {status:"offline"}
            ]
        }
    },
    {$group :
        {
            _id: "$category",
            total_price: {$sum:"$price"},
        }
    },
    {$match:
        {           
            total_price:{$gt:50}
        }
    },
    {$group :
        {
            _id: "1",
            avg_price: {$avg:"$total_price"},
        }
    },
]);

但我相信这个问题我将相同名称的分类组合在一起,这不是我想要的。

1 个答案:

答案 0 :(得分:2)

如果在线和离线是[{1}}的唯一值,您可以删除最初的status步骤。如果需要,使用$in operator更合适,因为这些值可以在同一个索引中找到(如果存在)。

我认为您唯一缺少的一步是您可以$match多个字段(即类别和状态):

$group