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

标签 mongodb mongodb-query

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

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

一个常见的查询是过滤和获取时间戳范围的文档:
collection.find({
  timestamp: {$lte: someDate, $gte: someLaterDate}
})

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

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

我想知道是否可以基于 timestamp 在集合上创建索引的日期而不是确切的日期时间?

我知道可以在应用程序代码中执行此操作,方法是向集合中添加一个新字段并创建一个具有最高日级别粒度的 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 创建性能相似的索引吗? field ?

最佳答案

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

BSON Date is a 64-bit integer that represents the number of milliseconds since the Unix epoch (Jan 1, 1970).


因此,对于索引或集合中的每次比较,您的服务器必须执行 64 位整数比较,无论您是否向日期添加时间。
可能有所不同的是,您不返回整个对象,而是只返回您实际想要使用的字段并创建一个组合索引,其中包含您作为第一个字段过滤的时间戳和所有之后的其他领域。通过这种方式,可以仅通过访问索引来回答查询,并且服务器不需要从索引上标识的磁盘加载所有对象。

关于MongoDB 以特定的粒度在日期上创建索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40052168/

相关文章:

javascript - 在 NodeJS 中从 MongoDB 获取元素并添加到要处理的列表/数组中

node.js - 如何在node.js、mongoose 中使用填充数据?

mysql - 如何在迭代中使用字段值本身更新 MongoDb 中的文档?

node.js - AWS elastic beanstalk Node.js 应用程序未连接到 Mongodb atlas

c# - MongoDB 和 C# Find()

MongoDB mongoexport 查询

mongodb - 让我的 mongoDB 在每天的特定时间收集数据?

mongodb - MongoDB 中的 deleteOne() 和 findOneAndDelete() 操作有什么区别?

regex - 在数组中使用正则表达式进行 Spring data mongo 查询

mongodb - 查询 mongoDB 时特定字段出现问题