1

我需要对包含时间戳字符串(“YYYYMMDD:HH:MM:SS.SSSS”)的集合运行查询。我想查找小时小于 9 小时和大于 14 小时的所有文档。SQL 提供了 MID() 函数,但我找不到等效函数。如何在 C++ 中运行此查询?如果您不知道如何在 C++ 中使用,但在 mongo shell 中告诉我,我也许可以将其转换为 C++。

更新 使用下面JohnnyHK的建议,我尝试了:

BSONObj queryafter = BSONObjBuilder().appendRegex("date", "........:0[0-8]").obj();
BSONObj queryafter = BSONObjBuilder().appendRegex("date", "........:[17-23]").obj();
c.update(dbcol, Query(querybefore), BSON("$set"<<BSON("noise"<<"true")), false, true);

它编译但没有正确过滤。

4

2 回答 2

3

它不是非常优雅,但是您可以在 shell 中使用正则表达式来执行此操作:

db.test.find({ts: /....:..:..:0[5-8]/})

在 C++ 驱动程序中,您将使用以下内容构建查询对象:

BSONObj query = BSONObjBuilder().appendRegex("ts", "....:..:..:0[5-8]").obj(); 

更新

对于您的新要求,它会涉及更多,但仍然可行:

BSONObjBuilder().appendRegex("ts", "^........:(0[0-8]|1[5-9]|2[0-3]):..:").obj();
于 2013-03-05T01:27:42.357 回答
0

你可以用 C++ 编写你自己的小方法来做到这一点。如果您有一个字符串"YYYY:MM:DD:HH:MM:SS.SSSS",那么您可以围绕:usingstrtok或对其进行标记stringstream。然后使用atoi将小时数转换为int,最后与 比较<9 & >4

是一个 strtok 示例,是一个 stringstream 示例。

编辑:如果您对字符串中小时的位置有信心(您必须是对的)那么您也可以在没有 for 循环的情况下这样做:

string timestamp = yourTimestamp;
int hours = atoi(timestamp.substr(12, 2).c_str())
if (hours < 9 && hours > 4)
    your stuff

解释是,substr 包含小时的部分,将其转换为 ac 字符串并转换为 int。使用小时数进行比较。

于 2013-03-05T01:28:40.063 回答