我有以下文件集:

{
    "id": ...,
    "key": 47
},
{
    "id": ...,
    "key": 12
}

我希望通过连接由|分隔的键来将整个集合聚合到单个字符串中.因此,在这里,输出将是字符串47|12.我不介意最后再多加|美元,如果这能让事情变得更容易的话.

这是如何在MongoDB聚合管道中实现的?我来自SQL,在PostgreSQL中,它看起来像select string_agg(key, "|" order by id) from my_table.

我想我可以这样做:首先将集合聚合到一个数组,然后在单个数组上使用$concat函数应用$reduce,但我不确定这是否是最好的解决方案,因为首先聚合到数组feels wrong.有没有办法立即减少Collection 量呢?

推荐答案

通过使用具有$push$group阶段来创建所有关键点的数组,可以获得所需的结果.之后,使用$reduce将键与所需的分隔符连接在一起.

例如,delimeter "|":

[
  {
    "$group": {
      "_id": null,
      "keys": { "$push": "$key" }
    }
  },
  {
    "$project": {
      "_id": 0,
      "concatenatedKeys": {
        "$reduce": {
          "input": "$keys",
          "initialValue": "",
          "in": { "$concat": ["$$value", "|", { "$toString": "$$this" }] }
        }
      }
    }
  }
]

最后,$toString在连接之前将每个键转换为字符串.如果所有密钥都是字符串类型,则可以省略此参数.

Mongodb相关问答推荐

会话的Mongo-go驱动程序版本.Copy()

在MongoDB集合中按文档内的频率对数组排序

MongoDB 投影按数组中的字符串长度排序

spring-data-mongodb 上的 TopN 聚合

使用 mongo-driver/mongo 使用键/值对中的值表达式查找文档

如何过滤查找mongodb的结果

MongoDB - 分组并找到前 N 个

MongoDB - 文档中多个数组大小的总和

Mongoose $inc 枚举验证失败

Mongoid 有 Map/Reduce 吗?

MongoDB 2.1 聚合框架总和匹配名称的数组元素

如何检索 MongoDb 集合验证器规则?

什么是 Mongoose (Nodejs) 复数规则?

Node.js MongoDB Upsert 更新

MongoDb:如何将附加对象插入对象集合?

将 MongoCursor from ->find() 转换为数组

如何在mongoDB中检索其值以特定字符结尾的文档

对于社交网站(使用 Ruby on Rails 开发)来说,MongoDB 会是一个好主意吗?

mongoose查询返回 null

如何在 Windows 上停止 mongodb 服务器?