Javascript Mongoose获取字段的和

Javascript Mongoose获取字段的和,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我试图根据两个mongoose模式跟踪用户的带宽使用情况。我有一个用户和图像模式,如果一个用户有很多图像。我的图像架构如下所示: image = { creator: 'ObjectId of user', size: '12345', //kb uploadedTo:[{}] } { $project: { size: 1, number_of_uploads: { $size: "$uploadedTo" }, total_ban

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

image = {
  creator: 'ObjectId of user',
  size: '12345', //kb
  uploadedTo:[{}]
}
{
  $project: {
    size: 1,
    number_of_uploads: {
      $size: "$uploadedTo"
    },
    total_bandwidth: {
      $multiply: [ "$size", "$number_of_uploads" ]
    }
}
本质上,我想创建一个查询,通过
image.creator
属性获取属于用户的所有图像。然后我将
image.size
属性乘以
image.uploadedTo.length
值,得到使用的总带宽

例如:如果用户有5个图像,每个图像为5000KB,并且每个图像上载到3个服务,则用户的总带宽将为75000KB(5*5000*3)

这个查询是严格通过mongoose实现的,还是我只需要获取用户的图像,然后使用常规javascript来获取总带宽?

您需要使用。基本投影可能如下所示:

image = {
  creator: 'ObjectId of user',
  size: '12345', //kb
  uploadedTo:[{}]
}
{
  $project: {
    size: 1,
    number_of_uploads: {
      $size: "$uploadedTo"
    },
    total_bandwidth: {
      $multiply: [ "$size", "$number_of_uploads" ]
    }
}
您将得到一个新文档,该文档如下所示:

{
  size: '1234',
  number_of_uploads: 2,
  total_bandwidth: 2468
}
您需要将其与

如果您使用的是MongoDB 3.2,您还可以使用(基本上是一个连接操作)作为管道的一部分来查找
创建者。\u id
,然后在所有图像上运行一个操作(您可能会使用该创建者id)。这样做的好处是服务器不做任何工作;查找和操作发生在MongoDB本身内部

如果您不使用v3.2,您可以利用它来查找(在您自己的服务器上)创建者ID,然后在您自己的服务器上使用JavaScript来计算总和

由于我没有示例数据集可供使用,所以我很难想出您的管道的确切外观,但上述工具应该是您所需要的全部

额外业务资源


(另外,你可能会把它看作是“WTF?”。有时候,自己计算并“使用常规javascript获取总带宽”会更容易一些,正如您所提到的。这两种解决方案都会起作用,这取决于您希望将负载放在哪里—无论是在MongoDB服务器上还是在您的服务器上—以及您希望进行的往返次数。)

虽然使用常规javascript方式对我来说要容易得多,但了解这些功能可能很重要($lookup、$project、aggregate等)因为我来自mysql世界。谢谢你的详细回答,现在我还有更多的阅读要做:)