javascript - 如何将每个对象都有一个元素数组的对象列表转换为具有子元素作为属性的对象数组

标签 javascript arrays mongodb mongoose lodash

上下文

示例 JSON 内容(使用 Mongoose 获取)

[
    {
        "name": "user1",
        "blogs": [
            {
                "title": "blog1",
                "created": "01-01-2020"
            },
            {
                "title": "blog2",
                "created": "01-01-2020"
            }
        ]
    },
    {
        "name": "user2",
        "blogs": [
            {
                "title": "blog3",
                "created": "01-01-2020"
            },
            {
                "title": "blog4",
                "created": "01-01-2020"
            }
        ]
    }
]

问题

我正在尝试显示所有博客帖子的列表,按帖子的创建日期排序,并显示创建该帖子的用户。

在 Pug 中注入(inject)上述对象并执行 foreach 将对用户的所有表演进行分组,并且无法对所有表演的创建日期(以该对象形式)进行排序。

我的解决方案将是以下目标:

示例 JSON,将每个博客条目映射到用户

[
    {
        "name": "user1",
        "blog": {
            "title": "blog1",
            "created": "01-01-2020"
        }
    },
    {
        "name": "user1",
        "blog": {
            "title": "blog2",
            "created": "01-01-2020"
        }
    },
    {
        "name": "user2",
        "blog": {
            "title": "blog3",
            "created": "01-01-2020"
        }
    },
    {
        "name": "user2",
        "blog": {
            "title": "blog4",
            "created": "01-01-2020"
        }
    }
]

此对象形式可以仍然显示每个博客条目的用户数据,并按表演的创建日期进行排序。

我正在尝试实现后者,但我还没有找到一种无需foreaching或映射的干净方法。

注意

这个问题可以通过定义关系并解析键来轻松解决,但我明确尝试使用 NoSQL 来解决这个问题。 。 因此,博客实体中没有用户的引用。

您将如何解决这个问题?这个特定操作的特征名称是什么?

最佳答案

您可以使用聚合从 MongoDB 中以所需格式获取数据,而不是首先以您不想要的格式从数据库获取数据,然后将其转换为您想要的格式:

db.collection.aggregate([
  { $unwind: "$blogs" },
  {
    $project: {
      "_id": 0,
      name: 1,
      blogs: 1,
      date: {
        $dateFromString: {
          dateString: "$blogs.created"
        }
      }
    }
  },
  { $sort: { date: -1 } },
  { $project: { date: 0 } }
])

上述查询中使用的聚合管道阶段的说明:

  1. $unwind - 解构 blogs 数组,以输出一个单独的文档,其中包含 blogs 数组中的每个对象

  2. $project - 隐藏 _id 字段,显示 nameblogs 字段并创建一个新的名为 date 的字段,并将其值设置为等于转换为日期的字段 created。 (created 字段的值将转换为日期,以便根据日期而不是日期字符串正确对文档进行排序。)

  3. $sort - 根据 date 字段按降序对文档进行排序(-1 表示降序,1 表示升序),即从最近的日期开始到更早的日期。

  4. $project - 在输出文档中隐藏日期字段

有关上述聚合管道阶段的详细信息,请参阅:

演示:

This demo显示上述查询的实际操作。

关于javascript - 如何将每个对象都有一个元素数组的对象列表转换为具有子元素作为属性的对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62951699/

相关文章:

javascript - 拖动 map 时,谷歌地图会加载附加标记

javascript - 如何在没有webpackJsonp的情况下生成js文件

c - 如何处理指向一个数组的结构组件,该数组的大小在声明结构之前是未知的?

javascript - 比较两个数组的值并相应地创建对象

php - SVG + PHP + Javascript

javascript - 为 Qt 文本片段创建鼠标悬停事件监听器

c++ - 通过数组排序 C++

c# mongo 2.0驱动在FindOneAndUpdateAsync之后获取项目

MongoDB作为静态文件提供者?

node.js - Node 应用程序无法连接到 MongoDB,但仅在 Docker 中