猫鼬得到的字段总和

时间:2016-11-04 21:07:13

标签: javascript node.js mongodb mongoose

我正在尝试根据两个mongoose模式跟踪用户的带宽使用情况。我有userimage架构,用户有很多图片。我的图像架构如下所示:

image = {
  creator: 'ObjectId of user',
  size: '12345', //kb
  uploadedTo:[{}]
}

基本上我想创建一个查询,通过image.creator属性获取属于用户的所有图像。然后,我将image.size属性乘以image.uploadedTo.length值,以获得使用的总带宽。

例如:如果用户有5张图片,每张图片为5,000kb,并且每张图片上传到3个服务,则该用户的总带宽为75,000kb(5 * 5,000 * 3)。

此查询是否可以通过mongoose严格执行,或者我是否必须获取用户的图像然后使用常规javascript来获取总带宽?

1 个答案:

答案 0 :(得分:3)

您需要使用aggregation pipeline。基本预测可能如下所示:

{
  $project: {
    size: 1,
    number_of_uploads: {
      $size: "$uploadedTo"
    },
    total_bandwidth: {
      $multiply: [ "$size", "$number_of_uploads" ]
    }
}

您将获得一个类似于:

的新文档
{
  size: '1234',
  number_of_uploads: 2,
  total_bandwidth: 2468
}

您需要将其与Mongoose's aggregate helper进行整合。

如果您正在使用MongoDB 3.2,您还可以使用$lookup(基本上是一个连接操作)作为管道的一部分来查找creator._id,然后运行{{3对所有图像进行操作(您可能$sum由该创建者ID进行操作)。这样做的好处是您的服务器不做任何工作;查找和操作发生在MongoDB本身。

如果您不使用v3.2,则可以利用$group在您自己的服务器上查找创建者ID,然后在您自己的服务器上使用JavaScript来计算总和。 / p>

由于我没有可以使用的样本数据集,因此我想要确切地说明您的管道会是什么样子有点困难,但上述工具应该是您需要的所有工具。

其他操作资源

(PS你可能会像“WTF”那样看待它。有时候你自己更容易进行计算并且“使用常规的javascript来获得总带宽”,正如你所提到的那样。两种解决方案都能正常工作,它只是取决于您想要加载的位置 - 无论是在MongoDB服务器上还是在服务器上 - 以及您想要进行多少次往返。)