在 mongodb 聚合框架中展开字典值

Posted

技术标签:

【中文标题】在 mongodb 聚合框架中展开字典值【英文标题】:Unwind dictionary values in mongodb aggregation framework 【发布时间】:2018-11-21 16:04:13 【问题描述】:

我需要从 mongodb 中存在的单个文档创建一些图。我只能使用 mongodb 聚合框架(例如,我不能只将文档拉入 python 并在那里使用它)。我正在使用元数据库的查询生成器,所以我在这方面受到限制。

为了做到这一点,我首先使用一些$match 查询来识别我需要查看的文档(这些是预定义的和静态的)。在$match 阶段之后,我只剩下一份文件(没关系),其结构如下。


 "id": 1,
 "locs": 
    "a":1,
    "b":2, 
    "c":3
  

我需要把这个结构改成这样:

["a":1, "b":2, "c":3"]

或任何其他允许我从结构中创建饼图的形式。

谢谢!

【问题讨论】:

【参考方案1】:

您可以使用$objectToArraylocs 对象转换为数组。现在将$unwindlocs 数组拆分为多个文档。使用$group$push 累加器将拆分数据再次转换为kv 格式。最后使用$replaceRoot 和最后的data 字段将其移动到$$ROOT 位置。

db.collection.aggregate([
   "$project":  "data":  "$objectToArray": "$locs" ,
   "$unwind": "$data" ,
   "$group": 
    "_id": "$data",
    "data":  "$push":  "k": "$data.k", "v": "$data.v" 
  ,
   "$project": 
    "data":  "$arrayToObject": "$data" 
  ,
   "$replaceRoot":  "newRoot": "$data" 
])

【讨论】:

你摇滚!它工作得几乎完美,我只需要在 $replaceRoot 步骤之前添加一个 "$unwind": "$data" 。 可以在没有$objectToArray/$arrayToObject(3.4.4之前)的聚合管道中完成吗? @Frayt 不。如果你更新你的 mongo 版本会更好,因为引入了新版本是为了舒适

以上是关于在 mongodb 聚合框架中展开字典值的主要内容,如果未能解决你的问题,请参考以下文章

从 MongoDB 聚合到 Spring Boot 聚合框架

mongodb 聚合 - 匹配 $nin 数组正则表达式值

mongodb高级聚合查询

Mongo聚合:返回数组值的总平均值

mongodb高级聚合查询

MongoDB聚合查询返回集合中每年每月的条目总数,按位置值分组