node.js - 如何计算数组内对象的值的总和,并使用 mongoose 聚合基于该总和添加一个字段?
问题描述
我正在用猫鼬编写一个复杂的聚合管道。我需要总结我的作者的每篇文章的观点,然后给作者赋予这个价值。数据现在看起来像这样:
{
_id: "...",
authorName: "...",
artiles: [
{articleTitle: "...", views: 4},
{articleTitle: "...", views: 2},
{articleTitle: "...", views: 10},
]
}
我想要的数据是这样的:
{
_id: "...",
authorName: "...",
artiles: [
{articleTitle: "...", views: 4},
{articleTitle: "...", views: 2},
{articleTitle: "...", views: 10},
],
totalArticleViews: 16 // 4 + 2 + 10
}
我如何使用猫鼬聚合管道来做到这一点?
另一件事是文章和视图有自己独立的模型。所以在管道中发生的是我正在使用 $lookup 来获取作者的所有文章,并且在 $lookup 内部还有另一个 $pipeline 获取特定文章的所有视图。
Author.aggregate([
{
$lookup: {
from: 'articles',
as: 'articles',
let: { localFieldValue: "$_id" },
pipeline: [
{ $match: { $expr: { $eq: ["$author", "$$localFieldValue"] } } },
{ $lookup: { from: 'views', localField: '_id', foreignField: 'document', as: 'views' } },
]
}
}
])
因此,与其在填充文章和视图之后计算视图计数,不如从包含视图的 $lookup 的 $pipeline 中增加作者的 totalViewCount 会更好。
解决方案
使用$reduce
你可以很容易地做到这一点。
询问
- 减少文章数组,从
sum=0
查找总浏览量开始 - 使用该总和在文档中添加一个字段
db.collection.aggregate([
{
"$set": {
"totalArticleViews": {
"$reduce": {
"input": "$articles",
"initialValue": 0,
"in": {
"$let": {
"vars": {
"tviews": "$$value",
"article": "$$this"
},
"in": {
"$add": [
"$$tviews",
"$$article.views"
]
}
}
}
}
}
}
}
])
推荐阅读
- apache - Apache AH01903:配置 CA 证书链失败!重启解决了
- r - 错误:找不到 Python 模块 tensorflow.python.keras
- python - 如何(/如果)使用 dask 转置分布式 3D numpy 数组?
- c# - 如何使用 NSwag 为 Web 套接字生成客户端代码
- android - 更新后对回收站视图进行排序的好方法和一些疑问
- cmake - find_library 不在默认目录之外搜索
- search - 带有特殊字符的 Office.js 通配符搜索使 Word Online 崩溃但未安装 MSWord
- java - JUnit 5 @ParameterizedTest 使用类作为@ValueSource
- java - 尝试在空对象引用上调用虚拟方法 'Button.setOnClickListener(android.view.View$OnClickListener)'
- java - 如何使用 Apache PdfBox 在 PDF 文件中获取书签页码?