我正在尝试根据两个mongoose模式跟踪用户的带宽使用情况。我有user
和image
架构,用户有很多图片。我的图像架构如下所示:
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来获取总带宽?
答案 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服务器上还是在服务器上 - 以及您想要进行多少次往返。)