我们在日常应用中非常依赖日期范围过滤器
例如:
}
但是,其中许多查询出现在“慢查询”列表中。 所以我想在每个文档上添加一个字符串“ day”字段
例如:
{
date: {
$gte: ISODate("2018-10-26"),
$lte: ISODate("2018-10-27"),
}
}
但是我找不到两个查询之间使用任何性能差异
{
day: "2018-10-26"
}
我知道.explain()
和totalDocsExamined
对于两个查询都是相同的,但是我找不到比较平均“扫描”复杂度的方法(我认为这将显示第二种方法的优越性) )。
值得吗?
答案 0 :(得分:0)
因此,您可以在日期范围查询中使用_id字段。由于MongoDB中的id是基于时间戳的。简单的js查询日期范围-
function objectIdWithTimestamp(timestamp) {
// Convert string date to Date object (otherwise assume timestamp is a date)
if (typeof(timestamp) == 'string') {
timestamp = new Date(timestamp);
}
// Convert date object to hex seconds since Unix epoch
var hexSeconds = Math.floor(timestamp/1000).toString(16);
// Create an ObjectId with that hex timestamp
var constructedObjectId = ObjectId(hexSeconds + "0000000000000000");
return constructedObjectId
};
var start = new Date(2018, 0, 1, 0, 0, 0, 0);
var startId = objectIdWithTimestamp(start.getTime());
db.user.find({"_id": { "$gte": startId }})
因为_id已被索引,所以它应该更快!您也可以对任何驱动程序使用相同的逻辑。我随时随地!