mongodb - 如何在 mongodb 上计算/求和数组?
问题描述
我有一个集合,其中每个文档都有一个名为“联系人”的数组。
示例文档:
{
"_id" : ObjectId("5660c2dfdfdfcba2d47baa2d9"),
"name" : john,
"contacts" : [
{
"name" : "ari",
"phone" : "12341234"
},
{
"name" : "dea",
"phone" : "34234234"
}
]
},
{
"_id" : ObjectId("5660c2dfdfdfcba2d47baa2d9"),
"name" : joni,
"contacts" : [
{
"name" : "budi",
"phone" : "13341234"
},
{
"name" : "ade",
"phone" : "3242343"
},
{
"name" : "are",
"phone" : "64545345"
}
]
}
我想知道获取所有文档的联系人总数。从示例文档输出应该是 5 个联系人
感谢你们对我的帮助。
解决方案
您可以尝试以下查询:
1)如果每个文档中都存在联系人数组:
db.collection.aggregate([
/** project only needed field contacts with size of array in each doc */
{
$project: {
_id: 0,
contacts: {
$size: "$contacts"
}
}
},
/** group on empty(without any filter) & sum contacts field */
{
$group: {
_id: "",
TotalContacts: {
$sum: "$contacts"
}
}
},
/** Optional projection */
{
$project: {
_id: 0
}
}
])
2)如果联系人数组字段可能不存在于每个文档中,如果它存在且不是数组,则必须在下面进行额外的类型检查$cond
:
db.collection.aggregate([
/** group on empty(without any filter) & sum contacts field's size if contacts exists else sum 0, You've can have optional projection as first stage like above query */
{
$group: {
_id: "",
TotalContacts: {
$sum: {
$cond: [
{
"$ifNull": [
"$contacts",
false
]
},
{
$size: "$contacts"
},
0
]
}
}
}
},
/** Optional projection */
{
$project: {
_id: 0
}
}
])
测试: MongoDB-游乐场
推荐阅读
- c - 数独问题的行/列总和背后的逻辑
- php - 如何逐行读取文件并跳过 PHP 中的一些中间换行符
- r - ```{r} 或 ```` 行的零长度变量名
- vba - 从 VBA 代码插入的 VBA 形状创建嵌入图片
- three.js - 使用 InterLeavedBuffer 时 ThreeJS 中的性能问题
- python - 如何在 python 的代码中键入单个反斜杠?
- spring-boot - Spring Boot Security - 从 http 8080 重定向到 https 433 不能正常工作
- uwp - UWP:默认的 HorizontalAlignment 是 Left not Stretch
- python - 安装 pyttsx3 时出现“没有这样的文件或目录”错误
- javascript - 如何为 html 上的视频启用自动播放功能?