例如,我有一个使用此架构的集合:
{
timestamp: new Date(some-arbitrary-specific-datetime),
some-other-field: any-type.
}
常见的查询是过滤并获取时间戳范围的文档:
collection.find({
timestamp: {$lte: someDate, $gte: someLaterDate}
})
性能很重要,因为此集合很大,查询可能会返回超过10万个文档。
在我的查询中,我只对日期级别的粒度感兴趣。
我想知道是否可以根据timestamp
的日期而不是确切的日期时间在集合上创建索引?
我知道可以在应用程序代码中执行此操作,方法是在集合中添加一个新字段,并创建一个具有最高日级粒度的日期,并以相同的方式查询,即:
{
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
字段创建性能相似的索引吗?
答案 0 :(得分:0)
我认为无论您存储一个带时间还是不带时间的日期都没有区别。在这两种情况下,它都应该作为 Date 存储在内部。只是时间将存储为全零。
<块引用>BSON 日期是一个 64 位整数,表示自 Unix 纪元(1970 年 1 月 1 日)以来的毫秒数。
因此,对于索引或集合中的每次比较,您的服务器必须执行 64 位整数比较,无论您是否在日期中添加时间。
有什么不同之处在于,您不返回整个对象,而是只返回您实际想要使用的字段并创建组合索引,其中包含您作为第一个字段过滤的时间戳以及之后的所有其他领域。这样就可以只访问索引来回答查询,服务器不需要从索引上标识的磁盘中加载所有对象。