javascript - 嵌套字段上的 MongoDB 聚合 $size
问题描述
我正在尝试执行一个棘手的聚合以返回集合中文档内嵌套数组的大小。
以下是如何重新创建我的示例数据:
db.test.insert({
projects: [
{
_id: 1,
comments: [
'a',
'b',
'c'
]
},
{
_id: 2,
comments: [
'a',
'b'
]
},
{
_id: 3,
comments: []
}
]
})
我将执行的聚合在这里:
db.test.aggregate([
// enter aggregation here
])
这是所需的输出:
[{
projects: [
{
_id: 1,
comment_count: 3
},
{
_id: 2,
comment_count: 2
},
{
_id: 3,
comment_count: 0
}
]
}]
我正在为如何写这个而苦苦挣扎。如果我尝试以下操作:
"projects.comment_count": {"$size": }
结果返回结果数组的大小:
[{
projects: [
{
_id: 1,
comment_count: 3
},
{
_id: 2,
comment_count: 3
},
{
_id: 3,
comment_count: 3
}
]
}]
如果我尝试像这样使用 $map 方法:
"projects.comment_count": {
"$map": {
"input": "$projects",
"as": "project",
"in": {
"$size": "$$project.comments"
}
}
}
它将为数组中的每个对象返回一个如下所示的数组:
[{
projects: [
{
_id: 1,
comment_count: [3, 2, 0]
},
{
_id: 2,
comment_count: [3, 2, 0]
},
{
_id: 3,
comment_count: [3, 2, 0]
}
]
}]
提前致谢!
解决方案
$unwind
这是一个使用,$group
然后$push
使用的想法$size
。最后$project
摆脱它_id
:
db.collection.aggregate([
{
"$unwind": "$projects"
},
{
$group: {
_id: null,
"projects": {
$push: {
_id: "$projects._id",
comment_count: {
$size: "$projects.comments"
}
}
}
}
},
{
"$project": {
"_id": 0
}
}
])
你可以在这里看到结果
推荐阅读
- c# - 将 TResult 转换为 Func
在 Xamarin.forms 中 - laravel - 如何让单元测试忽略 Laravel 中的中间件
- typescript - 如何从接口的属性中提取“枚举类型”?
- python - 如何使用 Python 将二元组列表转换为标记列表
- python - 在这个问题中如何在python中实现
- vue.js - 无法在 b-modal 中访问子组件 $refs
- flutter - Flutter - 如何为 BottomNavigationBar 添加分隔符?
- apache-spark - 将 apache spark rdd 写入多个 s3 文件夹
- javascript - 更改嵌套函数中的变量
- python - 如何使用 TextBlob 对整个 pandas 数据框列进行单数化和词形化?