gpt4 book ai didi

c++ - 为什么 find_one 不能在 MongoDB C++ 中工作?

转载 作者:行者123 更新时间:2023-11-28 05:57:43 25 4
gpt4 key购买 nike

我有一个使用 mongo shell 创建的 MongoDB 3.0.7 数据库。以下工作正常:

% mongo test
> vs = db.myCollection.findOne({"somefield.subfield": "somevalue"})

但是当我在 C++ 中这样做时:

    mongocxx::instance inst{};
mongocxx::client conn{};
auto db = conn["test"];
bsoncxx::stdx::optional< bsoncxx::document::value> docObj;

try {
docObj =
db["myCollection"]
.find_one(document{} <<
"somefield.subfield" << "someValue" <<
bsoncxx::builder::stream::finalize);
} catch (mongocxx::exception::operation e) {
std::cerr << "Retrieval failed (and exception thrown)";
}

if (docObj == bsoncxx::stdx::nullopt)
std::cerr << "Failed to find object";

我得到“找不到对象”。我在这里缺少什么?

更新:2015 年 11 月 23 日,10:00

我已经安装了最新的 cxx 驱动程序 (0.3.0),并进行了以下更改:

    mongocxx::instance inst{};
mongocxx::client *connPtr;
bsoncxx::stdx::string_view connectionString("mongodb://localhost");
connPtr = new mongocxx::client(mongocxx::uri(connectionString));
auto db = connPtr->database("test");;
bsoncxx::stdx::optional< bsoncxx::document::value> docObj;

try {
docObj =
db["myCollection"]
.find_one(document{} <<
"somefield.subfield" << "someValue" <<
bsoncxx::builder::stream::finalize);
} catch (mongocxx::exception::operation e) {
std::cerr << "Retrieval failed (and exception thrown)";
}

if (docObj == bsoncxx::stdx::nullopt)
std::cerr << "Failed to find object";

我又回到了完全相同的事情上。调用 db.list_collections(document{}) 不会检索任何结果。

最佳答案

bsoncxx 库有两种文档类型, View 和值。 document::value 包含实际的文档数据,而 document::view 只是对某些基础 value 的引用。 Value 必须比使用它们的 view 存在时间更长。

document::value 的传递方式在新的 c++11 驱动程序中存在一个错误。此代码生成一个 document::value :

document{} << "someField" << "someValue" << finalize;

collection.find_one() 方法采用document::viewdocument::values 隐式转换为document:: View 。不幸的是,这意味着如果您在调用 find_one() 时动态构建文档,如上所述,您可能搬起石头砸自己的脚:

collection.find_one(document{} << "someField" << "someValue" << finalize);

finalize 生成一个临时的 document::value,然后 find_one 将其转换为 document::view。临时 value 掉在地板上,让您的 view value 变少,就像一个悬垂的指针。

解决方法是在单独的调用中生成您的值,并保留它:

document::value doc = document{} << "someField" << "someValue" << finalize;
collection.find_one(doc.view());

我怀疑这是导致查询失败的原因;如果不是,它可以让您的代码恢复弹性!

您可以追踪this ticket真正解决这个问题。

关于c++ - 为什么 find_one 不能在 MongoDB C++ 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33844202/

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