【发布时间】:2015-05-17 07:39:27
【问题描述】:
我正在使用最新版本的新 C++ Mongodb 驱动程序/库(不是旧版 26compat 或 C 版本)以及 Qt 框架(Linux 上的最新 64b)。在同一个程序中,我成功地读取和写入数据库,并且一切正常。
我意识到这个版本不稳定,但我不想要 boost 依赖项,它是一个新项目,只有我在做。
我不是专业的程序员,所以请原谅任何知识空白。
在我的数据库中,我有一个支持集合,它只记住用户正在处理的最后一个项目,我想做的是使用存储在该文档中的值作为带有字段名称的字符串,以便在程序加载该项目时已启动。
我想使用存储在 m_Current_Project_key 变量中的密钥从项目集合中加载项目数据。
在find语句后的第一行下面的代码中,使用不同的硬编码字段名称和同一集合中的数据进行搜索,只是为了证明代码更普遍。
我遇到的问题是让程序在 mongo 命令行的集合和文档中正确搜索我可以看到的特定“_id”。
下面代码行末尾的 cmets 显示了我尝试过的不同方法的输出。
这位于一个方法中,该方法从同一数据库中读取不同的集合并从中获取一个值,并将其放入作为 QString 的 m_Current_Project_key 变量中。
qDebug() << m_Current_Project_key; // "553b976484e4b5167e39b6f1"
qDebug() << Utility::format_key(m_Current_Project_key); // "ObjectId("553b976484e4b5167e39b6f1")" - this utility function just modifies the value passed to it to look like the output
QString test = Utility::format_key(m_Current_Project_key);
test.remove('\"');
qDebug() << test; // "ObjectId(553b976484e4b5167e39b6f1)"
char const *c = m_Current_Project_key.toStdString().c_str();
qDebug() << c; // 553b976484e4b5167e39b6f1
bsoncxx::oid hhh(c, 12);
qDebug() << hhh.get_time_t(); // 892679010
auto cursor = db["project"].find(document{}
// << "title" << "Testing Project"
<< "_id"
<< c
// << hhh
// << m_Current_Project_key.toStdString()
// << m_Current_Project_key.toStdString().c_str()
// << Utility::format_key(m_Current_Project_key).toStdString()
// << test.toStdString()
<< finalize);
当我使用上面的标题行时,光标只指向一个值,没有接下来的两行 - 我得到的值是我想要的文档,但在实际情况下,程序唯一会知道的,此时将是“_id”。项目名称可能不是唯一的。
我已尝试将 std::string 转换为 OID,但未将其识别为类型。
我进行了很多谷歌搜索和很多尝试,但我不敢相信没有直接的方法可以根据文档的“_id”来查找文档。在示例中,唯一找到的示例使用“_id”以外的值。
db.project.find({ "_id" : ObjectId("553b976484e4b5167e39b6f1")}, { title : 1 })
在 Mongo 命令行上执行我想要的操作。
如果我能在这方面得到任何帮助,我将不胜感激,我已经花了很多时间来尝试。
谢谢。
【问题讨论】:
-
您的问题有点难以理解。您试图了解如何通过 id 进行查找的正确摘要是否正确?
-
是的,这就是问题所在,我可以看到如何使用旧版本,但不是新版本。感谢您的关注。