使用_id

时间:2015-04-26 17:39:14

标签: c++ mongodb qt

我使用的是最新版本的新C ++ Mongodb驱动程序/库(不是旧版本,26compat或C版本)以及Qt框架(Linux上的最新64b版本)。在同一个程序中,我成功地读取并写入数据库,一切运行良好。

我意识到这个版本不稳定,但我不想要提升依赖项,而且这是一个新项目,只有我正在处理。

我不是专业的程序员,所以请原谅任何知识差距。

在我的数据库中,我有一个支持集合,只记得用户正在处理的最后一个项目,我想要做的是使用存储在该文档中的值作为带有字段名称的字符串,以便在程序时加载该项目开始了。

我想使用存储在m_Current_Project_key变量中的密钥从项目集合中加载项目数据。

在find语句后面的第一行下面的代码中,使用不同的硬编码字段名称和同一集合中的数据进行搜索,只是为了证明代码更常用。

我遇到的问题是让程序搜索特定的“_id”,我可以在mongo命令行的集合和文档中正确查看。

以下代码行末尾的注释显示了我尝试过的不同内容所取得的成果。

这位于一个方法中,该方法从同一个数据库中读取不同的集合并从中获取一个值,它放在m_Current_Project_key变量中,该变量是一个QString。

    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命令行上我想要的是什么。

我很感激我能得到的任何帮助,我花了很多时间尝试。

感谢。

1 个答案:

答案 0 :(得分:3)

这里的问题是你使用了错误的bsoncxx::oid构造函数。从ObjectId的十六进制表示的oid创建std::string时(例如"553b976484e4b5167e39b6f1"),您应该使用带有stdx::string_view的单参数构造函数。

正确的代码如下所示:

using bsoncxx::stdx::string_view;

auto cursor = db["project"].find(document{} 
    << "_id"
    << bsoncxx::oid{stdx::string_view{m_Current_Project_key.toStdString()}}
    << finalize
);