【发布时间】:2016-06-21 22:54:08
【问题描述】:
我创建了一个聚合函数,我觉得它很长且非 DRY。我想知道有什么方法可以改进它。
我的Thread 模型有一个名为revisions 的子文档。该函数尝试获取具有status 或APPROVED 的最新修订版。
这是完整的模型。
{
"_id": ObjectId("56dc750769faa2393a8eb656"),
"slug": "my-thread",
"title": "my-thread",
"created": 1457249482555.0,
"user": ObjectId("56d70a491128bb612c6c9220"),
"revisions": [
{
"body": "This is the body!",
"status": "APPROVED",
"_id": ObjectId("56dc750769faa2393a8eb657"),
"comments": [
],
"title": "my-thread"
}
]
}
这是我要改进的聚合函数。
Thread.aggregate([
{ $match: {
slug: thread
} },
{ $project: {
user: '$user',
created: '$created',
slug: '$slug',
revisions: {
$filter: {
input: '$revisions',
as: 'revision',
cond: { $eq: [ '$$revision.status', 'APPROVED' ] }
}
}
} },
{ $sort: { 'revisions.created': -1 } },
{ $project: {
user: '$user',
created: '$created',
slug: '$slug',
revisions: { $slice: ["$revisions", 0, 1] }
} },
{ $unwind: '$revisions'},
{ $project: {
body: '$revisions.body',
title: '$revisions.title',
user: '$user',
slug: '$slug',
created: '$created'
}}
])
【问题讨论】:
-
请注意,您的示例文档中似乎缺少
"revisions.created"。我还解释了为什么其中的$sort阶段没有做你认为它正在做的事情。
标签: javascript mongodb mongoose mongodb-query aggregation-framework