上下文
示例 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 } }
])
上述查询中使用的聚合管道阶段的说明:
$unwind
- 解构blogs
数组,以输出一个单独的文档,其中包含blogs
数组中的每个对象$project
- 隐藏_id
字段,显示name
和blogs
字段并创建一个新的名为date
的字段,并将其值设置为等于转换为日期的字段created
。 (created
字段的值将转换为日期,以便根据日期而不是日期字符串正确对文档进行排序。)$sort
- 根据date
字段按降序对文档进行排序(-1 表示降序,1 表示升序),即从最近的日期开始到更早的日期。$project
- 在输出文档中隐藏日期
字段
有关上述聚合管道阶段的详细信息,请参阅:
演示:
This demo显示上述查询的实际操作。
关于javascript - 如何将每个对象都有一个元素数组的对象列表转换为具有子元素作为属性的对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62951699/