Javascript Mongoose获取字段的和
我试图根据两个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
用户
和图像
模式,如果一个用户有很多图像。我的图像架构如下所示:
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世界。谢谢你的详细回答,现在我还有更多的阅读要做:)