mongodb - 按列表中的元素和按字段计数
问题描述
我有一个如下所示的 MongoDB 集合:
{ "_id" : 1, "owner" : "Alice", airline: "RSAirlines", "content" : ["shoes", "pants", "sockets"]}
{ "_id" : 2, "owner" : "Bob", airline: "RSAirlines", "content" : ["phone", "pants"]}
{ "_id" : 3, "owner" : "Charlie", airline: "RSAirlines", "content" : ["shoes", "pants", "bag"]}
{ "_id" : 4, "owner" : "Mary" ,airline: "AirES" "content" : ["sandals", "coins", "sockets"]}
{ "_id" : 5, "owner" : "Olivia", airline: "AirES", "content" : ["gloves", "pants", "sockets"]}
{ "_id" : 6, "owner" : "Dan", airline: "AirES", "content" : ["sockets", "wallet"]}
{ "_id" : 7, "owner" : "Erin", airline: "AirES", "content" : ["pants", "sockets", "dress"]}
我希望aggregate
他们得到以下结果:
{ "_id": "RSAirlines", "counts": {
"shoes": 2,
"pants": 3,
"sockets": 1,
"phone": 1,
"bag": 1
}}
{ "_id": "AirES", "counts": {
"sandals": 1,
"coins": 1,
"sockets": 4,
"wallet": 1,
"dress": 1,
"pants": 2
}}
以前我看到了这个计算元素的答案,但现在我想用airline
.
解决方案
$unwind
解构content
数组$group
通过airline
andcontent
得到总数$group
由唯一airline
和构造counts
数组键值格式$arrayToObject
将键值数组转换为对象
db.collection.aggregate([
{ $unwind: "$content" },
{
$group: {
_id: {
airline: "$airline",
content: "$content"
},
count: { $sum: 1 }
}
},
{
$group: {
_id: "$_id.airline",
counts: {
$push: {
k: "$_id.content",
v: "$count"
}
}
}
},
{ $project: { counts: { $arrayToObject: "$counts" } } }
])
推荐阅读
- java - 如何在 Java11 中重现 Java8 用户 API 功能?(Java8 到 Java11 AppEngine 标准迁移)
- c# - 动画控制器中的混合树如何在动画之间平滑切换?
- flutter - Flutter:Get_Cli / 无法使用 get_cli 1.5.0 在 Flutter 中生成用户模型代码
- java - 在上下文范围内使用时如何使 log4j2 自定义过滤器对象工作?
- c++ - LDAP C++ 为什么 ldap_result 总是很忙?
- file-io - 一元文件 I/O
- python - 通过 OpenCV 在原始图像上标记 Blob 检测
- windows - 无法从 Windows 中的 ICS Internet 连接共享客户端 VM 访问主机 LAN 中的节点
- c# - 如何在按钮的构造函数中设置按钮以删除其父元素?
- c++ - 一个永远不能被称为 GCC 的模板构造函数