gpt4 book ai didi

javascript - Mongoose 获取字段的总和

转载 作者:可可西里 更新时间:2023-11-01 10:02:47 24 4
gpt4 key购买 nike

我正在尝试根据两个 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 来获取总带宽?

最佳答案

您需要使用 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,然后运行 ​​$sum对所有图像进行操作(您可能会通过该创作者 ID $group)。这样做的好处是您的服务器不做任何工作;查找和操作发生在 MongoDB 内部。

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

由于我没有可供使用的示例数据集,因此我很难想出您的管道究竟是什么样子,但上述工具应该是您所需要的全部。

额外的操作资源

(附言,您可能会像“WTF?”一样看待这个问题。有时自己进行计算并“使用常规 javascript 获取总带宽”会更容易,正如您提到的那样。这两种解决方案都可以,只是取决于你想把负载放在哪里 - 无论是在 MongoDB 服务器上还是在你的服务器上 - 以及你想要进行多少次往返。)

关于javascript - Mongoose 获取字段的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40431716/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com