我收集了以下文件:
{
"id": ...,
"key": 47
},
{
"id": ...,
"key": 12
}
我想通过连接键(由
|
分隔)将整个集合聚合为单个字符串。所以在这里,输出将是字符串 47|12
。我不介意在最后加上一个额外的|
,如果这样会让事情变得更容易的话。
这是如何在 MongoDB 聚合管道中完成的?我来自 SQL,在 PostgreSQL 中,这看起来像
select string_agg(key, "|" order by id) from my_table
。
我认为我可以通过首先将集合聚合到一个数组,然后在单个数组上应用
$reduce
和 $concat
函数来完成这项工作,但我不确定这是否是最好的解决方案,因为首先聚合到数组感觉不对。有没有办法立即减少集合?
可以通过使用
$group
阶段和 $push
创建所有键的数组来实现所需的结果。之后,使用 $reduce
将键与所需的分隔符连接起来。
带有分隔符的示例
"|"
:
[
{
"$group": {
"_id": null,
"keys": { "$push": "$key" }
}
},
{
"$project": {
"_id": 0,
"concatenatedKeys": {
"$reduce": {
"input": "$keys",
"initialValue": "",
"in": { "$concat": ["$$value", "|", { "$toString": "$$this" }] }
}
}
}
}
]
最后
$toString
在连接之前将每个键转换为字符串。如果所有键都是字符串类型,则可以省略。