1

タイムスタンプ文字列 ("YYYYMMDD:HH:MM:SS.SSSS") を含むコレクションに対してクエリを実行する必要があります。1 時間が 9 時間未満で 14 時間を超えるすべてのドキュメントを検索したいと考えています。SQL には MID() 関数が用意されていますが、同等の関数が見つかりませんでした。このクエリを C++ で実行するにはどうすればよいですか? C++ では方法がわからないが、mongo シェルでは教えていただければ、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

それほどエレガントではありませんが、正規表現を使用してシェルでこれを行うことができます。

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"トークン化できます。次に、 を使用して時間を に変換し、最後に と比較します。:strtokstringstreamatoiint<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 に答える