好的就是这个场景。我正在读取txt文件并将数据插入/更新(使用批量操作)到mongodb。 插入部分工作正常,因为我在循环中创建bson文档并执行mongoc_bulk_operation_insert。
我的约会格式为11:37:17.253 2015年6月5日 所以我通过删除.253和SAST的功能运行它 并将其提供给您在文本中看到的convert_to_date函数。
这是我创建时间戳并将日期附加到文档的方式:
int convert_to_date(char *dateString)
{
struct tm *parsedTime;
time_t rawTime;
time_t newTime;
int hour, minutes, seconds, millis, year, month, day;
if (sscanf(dateString, "%d:%d:%d %d %d %d",
&hour, &minutes, &seconds, &month, &day, &year) != EOF) {
time(&rawTime);
parsedTime = localtime(&rawTime);
parsedTime->tm_year = year - 1900;
parsedTime->tm_mon = month - 1;
parsedTime->tm_mday = day;
parsedTime->tm_hour = hour;
parsedTime->tm_min = minutes;
parsedTime->tm_sec = seconds;
newTime = mktime(parsedTime);
return newTime;
}
return 0;
}
/* this is somewhere in a loop */
time_t t = convert_to_date(s1);
bson_append_time_t(doc, field_map[y], strlen(field_map[y]), t);
// and after all if insert is supposed to happen i call
// mongoc_bulk_operation_insert(bulk, doc);
// and mongoc_bulk_operation_execute(bulk, &reply, &error);
当我看到我得到的数据库时,那部分就好了 ISODate(" 2015-06-05T09:37:17.000Z&#34)
当我尝试更新现有记录时,问题就出现了。
当我更新时,我需要在我想要更新的所有字段上设置$ set(实际上是upsert而我没有找到一种方法来立即更新完整文档) 它看起来像这样:
//update document with sessionid
query = BCON_NEW("SessionId", BCON_UTF8(sid));
update = BCON_NEW("$set", "{", "SomeDateTimeField",
BCON_DATE_TIME(ystack[y]), "}");
mongoc_bulk_operation_update(bulk, query, update, true);
ystack [y]的值是1433497048,这是有效的时间戳,但是 我进入db ISODate(" 1970-01-17T14:11:37.037Z") 我还在网上找到了一个插入整个bson对象的例子,如下所示:
int64_t currentTime = time(NULL) * 1000;
bson_t *date = BCON_NEW("$date", BCON_DATE_TIME(currentTime));
bson_t *update = BCON_NEW("$set", "{", "last_sync_time", date, "}");
但是这会在DB中产生\ u0001而不是有效日期。我不知道造成这种情况的原因是什么,应该是直截了当的事情。这是参考文献的libbson api
https://api.mongodb.org/libbson/current/index.html
和c司机api
http://api.mongodb.org/c/1.1.8/
答案 0 :(得分:1)
好的,我自己找到了解决方案,应该仔细阅读api:)
BCON_DATE_TIME接受毫秒而不是我传递给它的秒数。
我实际上试过乘以1000,但由于我的var是int,因此无法存储正确的值。
我必须将其声明为
unsigned long long
以下是仅供参考的更改代码
long convert_to_long(char *dateString)
{
struct tm *parsedTime;
time_t rawTime;
time_t newTime;
int hour, minutes, seconds, millis, year, month, day;
if (sscanf(dateString, "%d:%d:%d %d %d %d",
&hour, &minutes, &seconds, &month, &day, &year) != EOF) {
time(&rawTime);
parsedTime = localtime(&rawTime);
parsedTime->tm_year = year - 1900;
parsedTime->tm_mon = month - 1;
parsedTime->tm_mday = day;
parsedTime->tm_hour = hour;
parsedTime->tm_min = minutes;
parsedTime->tm_sec = seconds;
newTime = mktime(parsedTime);
unsigned long long millis = newTime * 1000;
return millis;
}
return 0;
}