我的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"操作员,但我没有取得好成绩。
答案 0 :(得分:1)
您可以修改聚合管道,如下所示:
Unwind
状态数组用来分隔子文档
状态数组。Group
,以便我们可以获得数组中的最后一个状态,
使用$last运算符。group
基于seller_id
的记录,以便我们可以
获得已售出商品总数的$sum
。Sort
按total_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}}
])