gpt4 book ai didi

C MongoDB 驱动程序日期时间更新

转载 作者:行者123 更新时间:2023-11-30 15:16:23 26 4
gpt4 key购买 nike

好的,这就是场景。我正在读取 txt 文件并将数据插入/更新(使用批量操作)到 mongodb。插入部分工作正常,因为我在循环中创建 bson 文档并执行 mongoc_bulk_operation_insert。

我的日期格式为 11:37:17.253 SAST JUN 05 2015所以我通过删除 .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")

所以问题是当我尝试更新现有记录时。

当我更新时,我需要对我想要更新的所有字段进行 $set(实际上更新插入,我没有找到立即更新完整文档的方法)它看起来像这样:

//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,这是有效的时间戳,但是 我进入数据库 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, "}");

但这会在数据库中产生\u0001 而不是有效日期。我不知道是什么原因造成的,对于一些应该直接进行的事情感到非常沮丧。这是供引用的libbson api

https://api.mongodb.org/libbson/current/index.html
和c驱动api
http://api.mongodb.org/c/1.1.8/

最佳答案

好吧,我自己找到了解决方案,应该更仔细地阅读 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;
}

关于C MongoDB 驱动程序日期时间更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33124789/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com