mongodb - MongoDB按数组中的元素分组
问题描述
我有一个看起来像这样的集合:
{
"id": "id1",
"tags": ['a', 'b']
},
{
"id": "id2",
"tags": ['b', 'c']
},
{
"id": "id3",
"tags": ['a', 'c']
}
如何进行按“标签”数组中的每个元素分组的查询,所以结果如下所示?:
{'a': 2},
{'b': 2},
{'c': 2}
(其中 2 是它出现的次数,计数)。谢谢你的帮助!
解决方案
您可以使用此聚合查询:
- 首先
$unwind
要解构访问类似对象的数组。 - 然后
$group
乘以1tags
得到$sum
总数。 - 最后使用
$replaceRoot
with$arrayToObject
来获得所需的输出。
db.collection.aggregate([
{
"$unwind": "$tags"
},
{
"$group": {
"_id": "$tags",
"count": {
"$sum": 1
}
}
},
{
"$replaceRoot": {
"newRoot": {
"$arrayToObject": [
[
{
"k": "$_id",
"v": "$count"
}
]
]
}
}
}
])
这里的例子
作为补充,如果您想获得排序值(a,b,c ...),您可以像这个示例$sort
一样添加阶段
推荐阅读
- python - 在redis lua脚本中存储'rpop'的本地中间结果
- c# - 在通过 Ajax 调用成功设置后,对象的集合在 Razor 页面中的帖子上为空
- sql - Postgres | 如何根据确切或更少的 IP 列表和简单的文本列表获取行
- javascript - 使用多个输入值Javascript进行多次添加
- laravel - Laravel 容器升级问题
- vue.js - 为 RelatedPeople 模型解释路线资源类型的问题
- oauth-2.0 - Keycloak 11.0.0 生成令牌范围参数无效
- ios - 如何用内部资源文件替换 WKWebView 响应?
- python - 在 Jupyter Notebook 中使用 ipywidgets 和 asyncio 以交互方式创建列表
- azure-ad-b2c - 无法自定义验证码消息