【问题标题】:MongoDB finding using an _idMongoDB 使用 _id 查找
【发布时间】: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 进行查找的正确摘要是否正确?
  • 是的,这就是问题所在,我可以看到如何使用旧版本,但不是新版本。感谢您的关注。

标签: c++ mongodb qt


【解决方案1】:

这里的问题是您使用了错误的bsoncxx::oid 构造函数。从 ObjectId 的十六进制表示形式的 std::string(例如 "553b976484e4b5167e39b6f1")创建 oid 时,您应该使用采用 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
);

【讨论】:

  • 我已经尝试过了,我收到了错误消息,提示“命名空间 'bsoncxxis::stdx' 是不允许的,并且没有在这个范围内声明 'stdx'。我想这意味着我缺少头文件或其他东西。我已经尝试了我认为最有可能的(大多数 bsoncxx 的),但无法摆脱错误。你能推荐正确的头文件吗?在搜索时,我发现了一个 boost 文件的建议,我认为它不适用于这些新版本的驱动程序。
  • 感谢您的帮助,我曾尝试使用 string_view,但无法使其正常工作,因此它具有帮助的正确命名空间 - 感谢您的帮助。
猜你喜欢
  • 2018-05-06
  • 2018-11-10
  • 2016-07-04
  • 2015-11-08
  • 2014-10-29
  • 1970-01-01
  • 2021-04-21
  • 2021-03-15
  • 1970-01-01
相关资源
最近更新 更多