mongodb - Mongodb:是否可以在一个查询中执行此操作?
问题描述
我是 Mongodb 的新手,这是我的文档格式:
{
"_id": {
"$oid": "5ee023790a0e502e3a9ce9e7"
},
"data": {
"Quick": [
["1591745491", "4", "uwp"],
["1591745492", "4", "uwp"],
["1591745516", "12", "Word"],
["1591747346", "8", "uwp"]
]
"Key": [
["1591747446", "Num"]
]
"Search": [
["1591745491", "tty"],
["1591745492", "erp"],
["1591745516", "Word"],
["1591747346", "uwp"]
]
},
"devicecode": "MP1G5L9EMP1G5L9E@LENOVO"
}
我想做的是:
- 按设备代码分组
- 对于每组,计算他们使用“Quick”、“key”和“Search”的次数(计算名称下的行数)
目前我正在使用 python 程序来完成这项工作。但我相信这应该是在 Mongodb 中完成它的一种方式。
输出格式应如下所示:
devicecode: MP1G5L9EMP1G5L9E@LENOVO, Quick: 400, key: 350, Search: 660
...
解决方案
您可以使用聚合框架来计算阶段中单个数组的长度,$set
然后在$group
阶段分组设备中计算从前一阶段计算的数组长度值。最后,在$project
舞台上映_id
射到devicecode
并取消选择_id
。
db.getCollection("testcollection").aggregate([
{
$set: {
QuickLen: {
$size: {
$ifNull: [
"$data.Quick",
[]
]
}
},
KeyLen: {
$size: {
$ifNull: [
"$data.Key",
[]
]
}
},
SearchLen: {
$size: {
$ifNull: [
"$data.Search",
[]
]
}
}
}
},
{
$group: {
_id: "$devicecode",
Quick: {
$sum: "$QuickLen"
},
key: {
$sum: "$KeyLen"
},
Search: {
$sum: "$SearchLen"
}
}
},
{
$project: {
devicecode: "$_id",
Quick: 1,
key: 1,
Search: 1,
_id: 0
}
}
])
推荐阅读
- gcc - 如何更改 OpenMPI 的编译器
- python-3.x - 如何检查进程之间腌制的数据
- windows - 如何以编程方式获取 Windows 显示器/监视器/屏幕标识号?
- python-3.x - Python - 如何创建连接命令
- java - 使 Mapbox 标记可点击并返回标记的 ID
- azure-devops - Azure DevOps - 应用服务 - 并行插槽交换
- c++ - 设置以改进 Visual Studio 难以理解的编译/构建错误:MSB6006:“CL.exe”退出代码 2
- kubernetes - 如何使用 rabbitmqctl 从 RabbitMQ Kubernetes 集群外部访问?
- android - 通过 Android 管理 API 自托管/EMM 托管的私有应用程序
- java - 如何在树中找到连接的道路元素