C MongoDB驱动程序DateTime更新

时间:2015-10-14 12:04:22

标签: c mongodb

好的就是这个场景。我正在读取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/

1 个答案:

答案 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;
 }