文档{}的mongodb C++驱动程序编译错误
mongdb c++ driver compilation error for document{}
我正在尝试将 mongodb 与最新的 c++ 驱动程序一起使用 example 作为参考。
我的代码如下:
#include <mongocxx/client.hpp>
#include <mongocxx/options/find.hpp>
#include <mongocxx/instance.hpp>
#include <mongocxx/uri.hpp>
using bsoncxx::builder::stream::document;
using bsoncxx::builder::stream::open_document;
using bsoncxx::builder::stream::close_document;
using bsoncxx::builder::stream::open_array;
using bsoncxx::builder::stream::close_array;
using bsoncxx::builder::stream::finalize;
class MongoDBApiUtils {
public :
MongoDBApiUtils(){}
static json validateDoc(const std::string& key ,const json& regInfo);
static json validatePreRegistration(const json& regInfo);
static bool checkUserExist(const json& regInfo);
static bool checkUserBlackList(const json& regInfo);
/*
* Retrieves a latest block from blockchain, based on the
* given query field. It is assumed that the database is
* indexed on the queryField, to avoid O(n) problem.
**/
static json getLatestBlock(
const mongocxx::database& db, const std::string& filter) {
auto cursor = db["ctlblocks"].find_one(document{} << filter << finalize);
}
/** Creates and adds a new block into the blockchain **/
static json addBlock(json& current, const json& prev) {
}
private :
};
#endif
但是我遇到编译错误,我无法破译。它通过调用 find_one
方法在我试图创建游标的行上给出错误。
In file included from /Volumes/second/nvi/github/blockchain_db/src/Impl/mongo/src/mongo_db_api.cpp:3:
/Volumes/second/nvi/github/blockchain_db/src/Impl/mongo/src/mongo_db_api_utils.hpp:47:46: error: no viable conversion from 'typename std::enable_if<!util::is_functor<const finalize_type &, void (single_context)>::value, key_context<closed_context> >::type' (aka 'bsoncxx::v_noabi::builder::stream::key_context<bsoncxx::v_noabi::builder::stream::closed_context>') to 'bsoncxx::document::view_or_value' (aka 'view_or_value<document::view, document::value>')
auto cursor = db["ctlblocks"].find_one(document{} << filter << finalize);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/local/include/bsoncxx/v_noabi/bsoncxx/view_or_value.hpp:60:20: note: candidate constructor not viable: no known conversion from 'typename std::enable_if<!util::is_functor<const finalize_type &, void (single_context)>::value, key_context<closed_context> >::type' (aka 'bsoncxx::v_noabi::builder::stream::key_context<bsoncxx::v_noabi::builder::stream::closed_context>') to 'bsoncxx::v_noabi::document::view' for 1st argument
BSONCXX_INLINE view_or_value(View view) : _view{view} {
^
/usr/local/include/bsoncxx/v_noabi/bsoncxx/view_or_value.hpp:69:20: note: candidate constructor not viable: no known conversion from 'typename std::enable_if<!util::is_functor<const finalize_type &, void (single_context)>::value, key_context<closed_context> >::type' (aka 'bsoncxx::v_noabi::builder::stream::key_context<bsoncxx::v_noabi::builder::stream::closed_context>') to 'bsoncxx::v_noabi::document::value &&' for 1st argument
BSONCXX_INLINE view_or_value(Value&& value) : _value(std::move(value)), _view(*_value) {
^
/usr/local/include/bsoncxx/v_noabi/bsoncxx/view_or_value.hpp:75:20: note: candidate constructor not viable: no known conversion from 'typename std::enable_if<!util::is_functor<const finalize_type &, void (single_context)>::value, key_context<closed_context> >::type' (aka 'bsoncxx::v_noabi::builder::stream::key_context<bsoncxx::v_noabi::builder::stream::closed_context>') to 'const bsoncxx::v_noabi::view_or_value<bsoncxx::v_noabi::document::view, bsoncxx::v_noabi::document::value> &' for 1st argument
BSONCXX_INLINE view_or_value(const view_or_value& other)
^
/usr/local/include/bsoncxx/v_noabi/bsoncxx/view_or_value.hpp:93:20: note: candidate constructor not viable: no known conversion from 'typename std::enable_if<!util::is_functor<const finalize_type &, void (single_context)>::value, key_context<closed_context> >::type' (aka 'bsoncxx::v_noabi::builder::stream::key_context<bsoncxx::v_noabi::builder::stream::closed_context>') to 'bsoncxx::v_noabi::view_or_value<bsoncxx::v_noabi::document::view, bsoncxx::v_noabi::document::value> &&' for 1st argument
BSONCXX_INLINE view_or_value(view_or_value&& other) noexcept
关于如何解决这个问题有什么想法吗?
您不在正确的流上下文中以传递 finalize
,因为您只向流提供了一个值。要使用流生成器,您传递一个键,然后传递它的值:
auto result = document{} << k1 << v1 << k2 << v2 << ... kn << vn << finalize
给你一个结果对象,其中包含一个代表 JSON
的 BSON 对象
{ 'k1' : v1, 'k2' : v2, ... 'kn' : vn }
您的代码只提供了类似关键的东西,因此文档流未处于 finalize
.
的接受状态
如果您的整个过滤器是 JSON 字符串,则只需使用 bsoncxx::from_json
将其转换为 BSON。另请注意,由于这种混淆和误用的机会,基于流的文档构建器或多或少地不再受到重视。
您可能会从 basic
建设者那里获得更好的里程数。
我正在尝试将 mongodb 与最新的 c++ 驱动程序一起使用 example 作为参考。
我的代码如下:
#include <mongocxx/client.hpp>
#include <mongocxx/options/find.hpp>
#include <mongocxx/instance.hpp>
#include <mongocxx/uri.hpp>
using bsoncxx::builder::stream::document;
using bsoncxx::builder::stream::open_document;
using bsoncxx::builder::stream::close_document;
using bsoncxx::builder::stream::open_array;
using bsoncxx::builder::stream::close_array;
using bsoncxx::builder::stream::finalize;
class MongoDBApiUtils {
public :
MongoDBApiUtils(){}
static json validateDoc(const std::string& key ,const json& regInfo);
static json validatePreRegistration(const json& regInfo);
static bool checkUserExist(const json& regInfo);
static bool checkUserBlackList(const json& regInfo);
/*
* Retrieves a latest block from blockchain, based on the
* given query field. It is assumed that the database is
* indexed on the queryField, to avoid O(n) problem.
**/
static json getLatestBlock(
const mongocxx::database& db, const std::string& filter) {
auto cursor = db["ctlblocks"].find_one(document{} << filter << finalize);
}
/** Creates and adds a new block into the blockchain **/
static json addBlock(json& current, const json& prev) {
}
private :
};
#endif
但是我遇到编译错误,我无法破译。它通过调用 find_one
方法在我试图创建游标的行上给出错误。
In file included from /Volumes/second/nvi/github/blockchain_db/src/Impl/mongo/src/mongo_db_api.cpp:3:
/Volumes/second/nvi/github/blockchain_db/src/Impl/mongo/src/mongo_db_api_utils.hpp:47:46: error: no viable conversion from 'typename std::enable_if<!util::is_functor<const finalize_type &, void (single_context)>::value, key_context<closed_context> >::type' (aka 'bsoncxx::v_noabi::builder::stream::key_context<bsoncxx::v_noabi::builder::stream::closed_context>') to 'bsoncxx::document::view_or_value' (aka 'view_or_value<document::view, document::value>')
auto cursor = db["ctlblocks"].find_one(document{} << filter << finalize);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/local/include/bsoncxx/v_noabi/bsoncxx/view_or_value.hpp:60:20: note: candidate constructor not viable: no known conversion from 'typename std::enable_if<!util::is_functor<const finalize_type &, void (single_context)>::value, key_context<closed_context> >::type' (aka 'bsoncxx::v_noabi::builder::stream::key_context<bsoncxx::v_noabi::builder::stream::closed_context>') to 'bsoncxx::v_noabi::document::view' for 1st argument
BSONCXX_INLINE view_or_value(View view) : _view{view} {
^
/usr/local/include/bsoncxx/v_noabi/bsoncxx/view_or_value.hpp:69:20: note: candidate constructor not viable: no known conversion from 'typename std::enable_if<!util::is_functor<const finalize_type &, void (single_context)>::value, key_context<closed_context> >::type' (aka 'bsoncxx::v_noabi::builder::stream::key_context<bsoncxx::v_noabi::builder::stream::closed_context>') to 'bsoncxx::v_noabi::document::value &&' for 1st argument
BSONCXX_INLINE view_or_value(Value&& value) : _value(std::move(value)), _view(*_value) {
^
/usr/local/include/bsoncxx/v_noabi/bsoncxx/view_or_value.hpp:75:20: note: candidate constructor not viable: no known conversion from 'typename std::enable_if<!util::is_functor<const finalize_type &, void (single_context)>::value, key_context<closed_context> >::type' (aka 'bsoncxx::v_noabi::builder::stream::key_context<bsoncxx::v_noabi::builder::stream::closed_context>') to 'const bsoncxx::v_noabi::view_or_value<bsoncxx::v_noabi::document::view, bsoncxx::v_noabi::document::value> &' for 1st argument
BSONCXX_INLINE view_or_value(const view_or_value& other)
^
/usr/local/include/bsoncxx/v_noabi/bsoncxx/view_or_value.hpp:93:20: note: candidate constructor not viable: no known conversion from 'typename std::enable_if<!util::is_functor<const finalize_type &, void (single_context)>::value, key_context<closed_context> >::type' (aka 'bsoncxx::v_noabi::builder::stream::key_context<bsoncxx::v_noabi::builder::stream::closed_context>') to 'bsoncxx::v_noabi::view_or_value<bsoncxx::v_noabi::document::view, bsoncxx::v_noabi::document::value> &&' for 1st argument
BSONCXX_INLINE view_or_value(view_or_value&& other) noexcept
关于如何解决这个问题有什么想法吗?
您不在正确的流上下文中以传递 finalize
,因为您只向流提供了一个值。要使用流生成器,您传递一个键,然后传递它的值:
auto result = document{} << k1 << v1 << k2 << v2 << ... kn << vn << finalize
给你一个结果对象,其中包含一个代表 JSON
的 BSON 对象{ 'k1' : v1, 'k2' : v2, ... 'kn' : vn }
您的代码只提供了类似关键的东西,因此文档流未处于 finalize
.
如果您的整个过滤器是 JSON 字符串,则只需使用 bsoncxx::from_json
将其转换为 BSON。另请注意,由于这种混淆和误用的机会,基于流的文档构建器或多或少地不再受到重视。
您可能会从 basic
建设者那里获得更好的里程数。