用C++驱动程序向MongoDB添加毫秒时间戳的最有效方法

Most Efficient Way to Add Millisecond Timestamps to MongoDB with C++ Driver

本文关键字:时间戳 有效 方法 驱动程序 C++ MongoDB 添加      更新时间:2023-10-16

我正在努力找出创建具有毫秒级时间戳的文档的最有效方法。经过一番周旋,我目前的做法如下:

我的时间戳最初是boost::posix_time::ptime格式。我可以使用boost::posix_time::time_from_string函数:从毫秒级的时间戳字符串创建一个ptime对象

std::string ts("2012-01-20 15:47:59.223");
ptime pt (time_from_string(ts));

然后我可以将ptime对象转换为mongo:DateT对象:

mongo::Date_t  dt = convert(pt);

其中转换定义为:

mongo::Date_t convert(const boost::posix_time::ptime& pt)
{
    boost::posix_time::ptime epoch(boost::gregorian::date(1970,boost::date_time::Jan,1));
    boost::posix_time::time_duration d = pt - epoch;
    return mongo::Date_t(d.total_milliseconds());
}

然后,我将Date_t对象附加到mongo::BSONObjBuilder:的一个实例中

mongo::BSONObjBuilder builder;
builder.genOID();
builder.appendDate ("datetime", dt );

最后,创建一个BSONObj并插入到数据库中。

BSONObj doc = builder.obj();
mongo.insert(collection, doc);

这是最有效的方法吗?我需要能够在毫秒级别上搜索数据库。我还需要能够分别查询日期和时间。我是否需要添加两个额外的字段,以便有三个与时间相关的字段:日期时间、日期和时间?。。。。。。。。。然后为每个字段创建索引?有更好的方法吗?

谢谢,

罗伯。

您应该使用MongoDB Date类型。这以比字符串更有效的格式存储日期,并包括毫秒精度。然后,您可以在字段上有一个单独的索引,可以使用任何日期/时间进行查询。

我还建议你阅读http://blog.pythonisito.com/2012/09/mongodb-schema-design-at-scale.html它为在MongoDB中存储时间序列数据提供了一些建议,尤其是在您进行大量更新的情况下。