我有一个收藏有700万条记录。我需要在特定日期范围内选择X个随机元素。
这是我的模式
mongoose.Schema({
transactionId: {type: String, required: [true, 'transactionId is required'], index: true},
createdAt: {type: Date, required: [true, 'date is required'], index: true},
userId: {type: String, required: [true, 'userId is required']}
});
这是我正在做的查询
TransactionModel.aggregate([
{
$match: {
createdAt: {$gte: startDate, $lt: endDate}
}
},
{
$sample: {
size: 100,
}
}
]
这些是我的结果:
Took 458ms to select 100 winners in date range: 1-5-2018 - 1-6-2018
Took 1524ms to select 100 winners in date range: 1-5-2018 - 1-9-2018
Took 2052ms to select 100 winners in date range: 1-4-2018 - 1-4-2019
Took 19249ms to select 100 winners in date range: 1-1-2018 - 1-1-2033
这19秒钟似乎比较长,当我从聚合函数中删除$ match时,仅需142毫秒即可从700万条记录中选出100个获胜者。
是否可以使用match子句提高速度?
答案 0 :(得分:0)
正如Anthony Winzlet已经写的那样,您需要在createdAt字段上有一个索引。这可以是单个字段索引,也可以是复合索引,其中createdAt是第一部分。
除此之外,在不需要文档的所有字段的情况下,您应该考虑使用$ project阶段。
理想情况下,您具有复合索引,该索引涵盖了您的查询。
您可以使用explain()来查看发生了什么:
collection.find(
{createdAt: {$gte: startDate, $lt: endDate}},
{ created: 1, otherField: 1 }
).explain('executionStats')