基于值折叠子文档的投影

用户817851

我有一个包含部门 ID 数组的子文档的数据结构,这些部门 ID 是包含 ID 和部门名称的对象。人们可能在很多部门,并且每个部门都有一个单独的 ID,因此他们的记录可能如下所示:

{ 
    "_id" : "xxxxx", 
    "dept_ids" : [
        {
            "dept_id" : "dd7867535", 
            "dept_name" : "d1"
        }, 
        {
            "dept_id" : "dl97087079", 
            "dept_name" : "d2"
        }
    ]
}

我正在将一个具有已知部门子集的聚合查询放在一起,我想使用“dept_name”的值来汇总这些值,以便生成的文档如下所示:

{ 
    "_id" : "xxxxx", 
    "d1" : "dd7867535",
    "d2" : "dl97087079"
}

我在聚合框架内找不到执行此操作的方法。欢迎大家提出意见。

谢谢,亚历克斯

尼尔伦

如果你真的有一个 MongoDB 支持$replaceRoot$arrayToObject那么你可以使用这个:

db.collection.aggregate([
  { "$replaceRoot": {
    "newRoot": {
      "$mergeObjects": [
        { "_id": "$_id" },
        { "$arrayToObject": {
          "$map": {
            "input": "$dept_ids",
            "in": { "k": "$$this.dept_name", "v": "$$this.dept_id" }
          }
        }}
      ]
    }
  }}
])

但是您甚至不需要它,只需转换返回的文档即可:

db.collection.find().map(d =>
  Object.assign(
    { _id: d._id },
    d.dept_ids.reduce((acc,dep) => Object.assign(acc,{ [dep.dept_name]: dep.dept_id }), {})
  )
);

在现代 ECMASCRIPT 环境中,不是 Mongo shell,而是像 NodeJS 这样的东西,你可以稍微清理一下语法。即使用 NodeJS 驱动程序:

const mapper = ({ _id, dept_ids }) => ({
  _id, ...dept_ids.reduce((acc, { dept_name: k, dept_id: v }) => ({ ...acc, [k]: v }),{})
});

let results = await db.collection('departments').find().map(mapper).toArray();

两者都产生相同的结果:

{ "_id" : "xxxxx", "d1" : "dd7867535", "d2" : "dl97087079" }

所以你真的不需要通过聚合管道来处理事情,这可以很简单地从客户端接收到的数据完成。您没有“减少”任何数据,这实际上是聚合框架的重点。所以像这样的转换真的“应该”在后处理游标结果中完成。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

基于非数组字段在mongo文档中投影数组值

来自分类Dev

使用聚合管道基于子文档值创建具有名称的MongoDB字段?

来自分类Dev

在聚合器中使用基于子文档值的条件的过滤器

来自分类Dev

仅基于子文档_id返回子文档,子文档_id是mongodb文档的array字段的项

来自分类Dev

仅返回投影数组子文档中的特定字段

来自分类Dev

Morphia-基于子文档的查询

来自分类Dev

根据子文档值搜索mongodb文档

来自分类Dev

子文档数组上的 MongoDB 查询和投影也返回另一个文档的数组

来自分类Dev

基于文档值的CouchDB批量更新

来自分类Dev

基于组意外行为的子文档字段汇总

来自分类Dev

如何基于子节点合并/分组 XML 文档

来自分类Dev

MongoDB:汇总子文档数组上的值

来自分类Dev

mongodb查找子文档的所有值

来自分类Dev

使用C#.NET驱动程序2.0投影mongodb子文档

来自分类Dev

在MongoDB的子文档中查找具有特定值的文档

来自分类Dev

如何使用主文档中的值查询子文档数组

来自分类Dev

根据子文档中的值对mongo db文档进行排序

来自分类Dev

MongoDB:查找其子文档包含给定值的文档

来自分类Dev

基于子查询值的MySQL查询限制

来自分类Dev

SQL选择基于来自子查询的值

来自分类Dev

动态mongo投影-使用文档中的字段确定投影的投影

来自分类Dev

如何在查询时基于属性值提升Solr文档

来自分类Dev

基于子值合并多维数组的子数组

来自分类Dev

基于节点属性值的Echo XML子节点值

来自分类Dev

如何基于JObject的子属性值选择父属性值

来自分类Dev

基于节点属性值的Echo XML子节点值

来自分类Dev

MongoDB如何获取子文档的属性等于某个值的不同子文档列表?

来自分类Dev

Mongodb Update子文档的值与子文档匹配且不更改其他字段

来自分类Dev

猫鼬查询基于嵌套文档中的值列出文档

Related 相关文章

  1. 1

    基于非数组字段在mongo文档中投影数组值

  2. 2

    使用聚合管道基于子文档值创建具有名称的MongoDB字段?

  3. 3

    在聚合器中使用基于子文档值的条件的过滤器

  4. 4

    仅基于子文档_id返回子文档,子文档_id是mongodb文档的array字段的项

  5. 5

    仅返回投影数组子文档中的特定字段

  6. 6

    Morphia-基于子文档的查询

  7. 7

    根据子文档值搜索mongodb文档

  8. 8

    子文档数组上的 MongoDB 查询和投影也返回另一个文档的数组

  9. 9

    基于文档值的CouchDB批量更新

  10. 10

    基于组意外行为的子文档字段汇总

  11. 11

    如何基于子节点合并/分组 XML 文档

  12. 12

    MongoDB:汇总子文档数组上的值

  13. 13

    mongodb查找子文档的所有值

  14. 14

    使用C#.NET驱动程序2.0投影mongodb子文档

  15. 15

    在MongoDB的子文档中查找具有特定值的文档

  16. 16

    如何使用主文档中的值查询子文档数组

  17. 17

    根据子文档中的值对mongo db文档进行排序

  18. 18

    MongoDB:查找其子文档包含给定值的文档

  19. 19

    基于子查询值的MySQL查询限制

  20. 20

    SQL选择基于来自子查询的值

  21. 21

    动态mongo投影-使用文档中的字段确定投影的投影

  22. 22

    如何在查询时基于属性值提升Solr文档

  23. 23

    基于子值合并多维数组的子数组

  24. 24

    基于节点属性值的Echo XML子节点值

  25. 25

    如何基于JObject的子属性值选择父属性值

  26. 26

    基于节点属性值的Echo XML子节点值

  27. 27

    MongoDB如何获取子文档的属性等于某个值的不同子文档列表?

  28. 28

    Mongodb Update子文档的值与子文档匹配且不更改其他字段

  29. 29

    猫鼬查询基于嵌套文档中的值列出文档

热门标签

归档