计算复杂的对象结构数组(mongodb)中ID的出现

时间:2019-01-27 20:23:49

标签: node.js mongodb aggregation-framework

我需要检查对象结构的高复杂度数组中特定产品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个产品。

谢谢。

0 个答案:

没有答案