获得每个卖家的总销售额

时间:2014-12-19 16:09:51

标签: mongodb mongodb-query

我的mongo数据库中包含代表以下产品项目的文档:

{
"_id" : ObjectId("548c2a140c2c375d261a7238"),
"statuses" : [
    {
        "item_status_id" : ObjectId("548c2a140c2c375d261a7239"),
        "sold" : 82,
        "price" : 1899
    },
    {
        "item_status_id" : ObjectId("548f282c0c2c371a72a47ae8"),
        "sold" : 84,
        "price" : 1899
    },
    {
        "item_status_id" : ObjectId("548f5ed70c2c37204d35cfa4"),
        "sold" : 85,
        "price" : 1899
    },
    {
        "item_status_id" : ObjectId("54904a090c2c3719de96c6cf"),
        "sold" : 86,
        "price" : 1899
    }
],
"item_id" : "MLM470322597",
"title" : "Sony Xperia Miro St23 4gb 5mpx Android 4.0 Wifi 3g",
"seller_id" : 20906313,
}

我想按销售商品总数对畅销商品(使用seller_id)进行排名。价值"卖出"必须从"状态"的最后位置(在上面的情况中为86)拉出阵列。

我一直在查看mongodb文档,我认为可以使用$ group子句来完成。

这是我到目前为止所得到的:

db.items.aggregate(
   [
      {
        $group : {
           _id : $seller_id,
           totalSold: { $sum: ?? },
           count: { $sum: 1 }
        }
      }
   ]
)

问题在于,我不知道如何才能将查询与最后一次出售"出售" "状态"的项目数组以便聚合它们。我一直在关注" $ slice"操作员,但我没有取得好成绩。

1 个答案:

答案 0 :(得分:1)

您可以修改聚合管道,如下所示:

  • Unwind状态数组用来分隔子文档 状态数组。
  • 再次
  • Group,以便我们可以获得数组中的最后一个状态, 使用$last运算符。
  • 然后再次group基于seller_id的记录,以便我们可以 获得已售出商品总数的$sum
  • {li> Sorttotal_sold降序排列。

代码:

db.collection.aggregate([
{$unwind:"$statuses"},
{$group:{"_id":"$_id",
         "sold":{$last:"$statuses.sold"},
         "seller_id":{$last:"$seller_id"}}},
{$group:{"_id":"$seller_id",
         "total_sold":{$sum:"$sold"}}},
{$sort:{"total_sold":-1}}
])
相关问题