我需要检查对象结构的高复杂度数组中特定产品ID的出现次数。
我尝试使用MongoDB的聚合功能,但是我只获得每个文档的出现次数,而不是所有文档的出现次数。每个文档的数据结构如下:
{
"_id" : ObjectId("5c4d67905a07f5dec1fcc763"),
"updatedAt" : ISODate("2019-01-27T08:16:11.706Z"),
"createdAt" : ISODate("2019-01-27T08:10:56.553Z"),
"pickupTime" : ISODate("2019-01-27T08:20:00.000Z"),
"shop" : ObjectId("5c24b007b55ea3d7c599c95b"),
"owner" : ObjectId("5c242e361ee775cdd8b047b6"),
"total" : 350,
"status" : "completed",
"lineItems" : [
{
"product" : {
"options" : [],
"enabled" : false,
"description" : "",
"shop" : ObjectId("5c24b007b55ea3d7c599c95b"),
"price" : 350,
"name" : "Capuccino",
"createdAt" : ISODate("2019-01-01T21:56:31.928Z"),
"updatedAt" : ISODate("2019-01-08T12:14:53.322Z"),
"_id" : ObjectId("5c2be20f8e52115849726fdc")
},
"_id" : ObjectId("5c48efbc9efde32fab7ae47d"),
"status" : "pending",
"quantity" : 1,
"config" : []
}
],
"__v" : 0
}
如您所见,每个文档都是一个订单,每个订单都有lineItems,它们是一个对象数组,其中包含所需产品的数量,当前产品的状态,某些配置以及产品本身。产品字段是订购时产品的快照,因为供应商可能会更改产品(成本,名称说明等)
我目前正在尝试下一个汇总公式:
{
$group: {
_id: {
'product': '$lineItems.product._id'
},
count: {
$sum: 1
}
}
}
但是仅返回每个订单中产品的出现次数,而不是交叉所有订单。我知道我需要使用$ reduce重新格式化数据结构,但是我找不到一种方法来整理我当前的数据结构以使其匹配。我还说过,在对每种产品计数之后,我可以使用$ sort将最高值放在顶部,然后将搜索限制为要返回的记录量
理想的结果是根据订单数据获得销量最高的5个产品。
谢谢。