MongoDB 以特定的粒度在日期上创建索引?

Wil*_*Wee 8 mongodb mongodb-query

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

{
  timestamp: new Date(some-arbitrary-specific-datetime),
  some-other-field: any-type.
}
Run Code Online (Sandbox Code Playgroud)

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

collection.find({
  timestamp: {$lte: someDate, $gte: someLaterDate}
})
Run Code Online (Sandbox Code Playgroud)

性能很重要,因为这个集合很大,并且查询可能返回超过 10 万个文档。

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

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

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

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

并查询:

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

并创建索引:

collection.collectionName.createIndex({date: 1});
Run Code Online (Sandbox Code Playgroud)

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

Sim*_*ant 0

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

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

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

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