【问题标题】:MongoDB create index on date with specific granularity?MongoDB在特定粒度的日期创建索引?
【发布时间】:2017-02-24 10:01:05
【问题描述】:

例如,我有一个具有此架构的集合:

{
  timestamp: new Date(some-arbitrary-specific-datetime),
  some-other-field: any-type.
}

而一个常见的查询是过滤获取某个时间戳范围的文档:

collection.find({
  timestamp: {$lte: someDate, $gte: someLaterDate}
})

性能很重要,因为这个集合很大,查询可能返回超过 100k 的文档。

在我的查询中,我只对天级别的粒度感兴趣。

我想知道是否可以根据 timestamp 的日期而不是确切的 DateTime 在集合上创建索引?

我知道可以在应用程序代码中执行此操作,方法是向集合中添加一个新字段并创建一个具有最高级别粒度的 Date 并以相同的方式查询它,即:

{
  timestamp: new Date(1476479514),
  date: new Date("2016-10-14"),
  some-other-field: any-type
}

和查询:

collection.find({
  date: {$lte: new Date("2016-10-14"), $gte: new Date("2016-10-12")}
})

并创建索引:

collection.collectionName.createIndex({date: 1});

但现在在应用程序代码中执行此操作是不可行的。我可以仅使用 timestamp 字段创建性能相似的索引吗?

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    我认为存储日期是否有时间都没有区别。在这两种情况下,它都应该在内部存储为Date。只是时间将被存储为全零。

    BSON 日期是一个 64 位整数,表示自 Unix 纪元(1970 年 1 月 1 日)以来的毫秒数。

    因此,对于索引或集合中的每次比较,您的服务器必须执行 64 位整数比较,无论您是否在日期中添加时间。

    可能会有所不同的是,您不会返回整个对象,而是只返回您实际想要使用的字段并创建组合索引,其中包含您作为第一个字段过滤的时间戳以及之后的所有其他领域。这样查询就可以通过只访问索引来回答,服务器不需要从索引上标识的磁盘加载所有对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 2011-03-20
      • 1970-01-01
      • 1970-01-01
      • 2020-10-08
      • 2018-07-13
      相关资源
      最近更新 更多