查询MongoDB中的字符串中间?

时间:2013-03-05 01:19:47

标签: c++ mongodb

我需要对包含时间戳字符串(“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);

已编译但未正确过滤。

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

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

Here是一个strtok示例,here是一个字符串流示例。

编辑:如果你对字符串中的小时位置有信心(你必须是对的)那么你也可以这样做而不用for循环:

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

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