Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将每个对象都具有元素数组的对象列表转换为以子元素为属性的对象数组 上下文 Node.js项目,并作为模板引擎_Javascript_Arrays_Mongodb_Mongoose_Lodash - Fatal编程技术网

Javascript 如何将每个对象都具有元素数组的对象列表转换为以子元素为属性的对象数组 上下文 Node.js项目,并作为模板引擎

Javascript 如何将每个对象都具有元素数组的对象列表转换为以子元素为属性的对象数组 上下文 Node.js项目,并作为模板引擎,javascript,arrays,mongodb,mongoose,lodash,Javascript,Arrays,Mongodb,Mongoose,Lodash,使用Mongoose获取的JSON内容示例 问题 我试图显示所有博客文章的列表,按文章的创建日期排序,并显示创建它的用户 在Pug中注入上述对象并执行foreach将由用户对所有表演进行分组,并使得无法在此对象形式中对所有表演的创建日期进行排序 我的解决方案是针对以下问题: 示例JSON,将每个博客条目映射到一个用户 此对象表单可以在每次博客条目中显示用户的数据,并在性能创建日期进行排序 我正试图实现后者,但我还没有找到一种干净的方法来实现它,而无需预先设定或映射 笔记 这个问题可以通过定义关系

使用Mongoose获取的JSON内容示例

问题 我试图显示所有博客文章的列表,按文章的创建日期排序,并显示创建它的用户

在Pug中注入上述对象并执行foreach将由用户对所有表演进行分组,并使得无法在此对象形式中对所有表演的创建日期进行排序

我的解决方案是针对以下问题:

示例JSON,将每个博客条目映射到一个用户 此对象表单可以在每次博客条目中显示用户的数据,并在性能创建日期进行排序

我正试图实现后者,但我还没有找到一种干净的方法来实现它,而无需预先设定或映射

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

您将如何解决此问题,以及此特定操作的特征名称是什么?

尝试使用Array.prototype.reduce。像这样的-

常数数据=[ { 姓名:user1, 博客:[ { 标题:blog1, 创建日期:01-01-2020 }, { 标题:博客2, 创建日期:01-01-2020 } ] }, { 姓名:user2,, 博客:[ { 标题:blog3, 创建日期:01-01-2020 }, { 标题:blog4, 创建日期:01-01-2020 } ] } ]; const result=data.reduceac,curr=>{ const{name,blogs}=curr; const blogArr=blogs.mapblog=>{ 返回{ 名称 博客 }; }; Array.prototype.push.applyacc,blogArr; 返回acc; }, [];
console.logresult 您可以使用聚合从MongoDB获取所需格式的数据,而不是先从数据库中获取不需要的格式的数据,然后将其转换为所需的格式:

db.collection.aggregate([
  { $unwind: "$blogs" },
  {
    $project: {
      "_id": 0,
      name: 1,
      blogs: 1,
      date: {
        $dateFromString: {
          dateString: "$blogs.created"
        }
      }
    }
  },
  { $sort: { date: -1 } },
  { $project: { date: 0 } }
])
解释上述查询中使用的聚合管道阶段:

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

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

$sort-根据日期字段按降序对文档进行排序-1表示降序,1表示升序,即从最近的日期到较旧的日期

$project-从输出文档中隐藏日期字段

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

演示:
显示了上面提到的实际查询。

我将使用MongoDB提供的名为聚合的功能。 聚合可以让您在获取数据之前按照所需的方式格式化数据

聚合以管道格式工作。您给它一个命令列表,这些命令将按照发送顺序执行

在这种情况下,聚合管道如下所示:

[{ $REWIND:{ 路径:“$blogs” } }, { $项目:{ _id:0, 姓名:1,, 博客:“$blogs” } }, { $sort:{ blogs.created:-1 } }] 此管道中使用的命令:

$unwind-将项目数组解构为多个文档,这些文档都包含原始文档的原始字段,但“解构”字段除外,该字段现在的值为数组中所有解构对象

$project—它允许您按需格式化数据、删除字段、添加字段和重命名字段

$sort-顾名思义,它允许您对文档进行排序,指定要排序的字段以及升序或降序

有关聚合的更多信息,请访问MongoDB的网站:


太棒了,我没有考虑使用聚集体,因为我认为它会使操作过于复杂,但这实际上相当整洁!“放松”是我一直在寻找的关键词!非常感谢。
[
    {
        "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"
        }
    }
]
db.collection.aggregate([
  { $unwind: "$blogs" },
  {
    $project: {
      "_id": 0,
      name: 1,
      blogs: 1,
      date: {
        $dateFromString: {
          dateString: "$blogs.created"
        }
      }
    }
  },
  { $sort: { date: -1 } },
  { $project: { date: 0 } }
])