我应该使用日期字符串字段而不是日期范围吗?

时间:2018-10-27 21:00:54

标签: mongodb

我们在日常应用中非常依赖日期范围过滤器

例如:

}

但是,其中许多查询出现在“慢查询”列表中。 所以我想在每个文档上添加一个字符串“ day”字段

例如:

{
   date: {
     $gte: ISODate("2018-10-26"),
     $lte: ISODate("2018-10-27"),
   }
 }

但是我找不到两个查询之间使用任何性能差异 { day: "2018-10-26" }

我知道.explain()totalDocsExamined对于两个查询都是相同的,但是我找不到比较平均“扫描”复杂度的方法(我认为这将显示第二种方法的优越性) )。

值得吗?

1 个答案:

答案 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已被索引,所以它应该更快!您也可以对任何驱动程序使用相同的逻辑。我随时随地!