如何获取登录用户的对象数组的总和

时间:2019-01-16 19:01:42

标签: node.js mongodb mongoose

一个用户可以添加多个产品,而多个用户可以请求该产品。对于每个产品,我都有一个对象数组,其中包含请求该产品的用户的用户ID。我试图获取所有请求的总和,例如:(为简单起见,将对象ID组成,我知道它们不现实)

下面我有2个产品,一个产品有一个请求,第二个产品有2个请求,因此该用户有2个产品和3个请求。我正在尝试获取3的值。

_id: ObjectId("12323443463")
userId: ObjectId("88888888")
title: "Product 1"
requests: Array
0: Object
_id: ObjectId("89766876")
userId: ObjectId("09795675")


_id: ObjectId("9878754")
userId: ObjectId("88888888")
title: "Product 2"
requests: Array
0: Object
_id: ObjectId("89766876")
userId: ObjectId("09795675")

1: Object
_id: ObjectId("66445547676")
userId: ObjectId("7765543434")

我尝试过:

  Product.aggregate([
    { $match: { userId: req.user._id }},
    { $group: { _id: "$requests.userId", totals: { $sum: 1 } } }
  ])

如果我用console.log记录,则会得到:

[ { _id: [ 5c375260a6f58308e510711a, 5c25cddc73d10c02a75b3d55 ],
    totals: 1 },
  { _id: [ 5c375260a6f58308e510711a ], totals: 1 } ]

这是正确的,因为它为我提供了请求该产品的用户的3个ID。但是,我真的只希望查询结果为3。

1 个答案:

答案 0 :(得分:1)

您可以使用以下汇总

Product.aggregate([
  { "$match": { "userId": req.user._id }},
  { "$group": { "_id": null, "totals": { "$sum": { "$size": "$requests" } } } }
])

基本上,您需要$sum requests数组的$size