我已经定义了一个请求架构:
var RequestSchema = new Schema({
date: {
type: Date,
required: true,
default: Date.now
},
status: {
type: String,
enum: ['Open', 'Closed'],
required: true,
default: 'Open'
}
});
请考虑以下文件:
{ status: 'Closed',
date: 2018-08-15T22:43:55.073Z,
_id: 5b61b3b8de9c7252efb77238,
__v: 0 }
{ status: 'Open',
date: 2019-08-15T22:43:55.073Z,
_id: 5b61b3b8de9c7252efb77239,
__v: 0 }
我想要实现的目标很简单,但似乎无法使其实现。我需要一份列出所有提出要求的年份的清单,例如,如果我们考虑上述文件,我希望得到以下清单:
['2018', '2019']
我是Webdev领域的新手,所以我能想到的最简单的解决方案是:
var years = [];
for (var i = 0; i < 100; i++) {
var start = new Date(2018 + i, 1, 1);
var end = new Date(2018 + i, 12, 31);
Request.findOne({ date: { $gte: start, $lt: end } })
.then(function(request) {
if (request) {
years.push(2018 + i);
}
});
}
res.json(years);
很明显,由于变量 years 不会更改,因为 years.push()是从回调函数执行的,因此不会起作用。我以为可以找到解决方法,但是直到现在我都找不到。
任何帮助将不胜感激!
答案 0 :(得分:1)
在mongoDB中为您执行此操作的查询将是这样的:
db.getCollection('<YourCollectionName>').aggregate([
{ $project: { _id: 0, year: { $year: "$date" }}},
{ $group: { "_id": null, years: { $push: "$year" } } }
])
它会给您这样的结果:
{
"_id" : null,
"years" : [2018, 2019]
}
现在您有了Years数组。
在您的查询中,您正在做findOne
,但是您需要进行汇总才能按年份键入结果。我相信还有其他方法可以通过MongoDB查询获得结果,但这应该可以帮助您入门。
因此,您所需要做的就是将其转换为猫鼬...应该是以下内容之一:
const aggregate = Model.aggregate([
{ $project: { _id; 0, year: { $year: "$date" } } },
{ $group: { "_id": null, years: { $push: "$year" } } }
]);
尚未测试过,请谨慎操作:)