我正在尝试使用mongodb作为我的C++11代码中向量矩阵的第二层数据库。
我有std::vector<matrix<float, 0 , 1 >> object_descriptors;
向量,我想把它们中的每一个都插入mongodb,然后读回std::vector<matrix<float, 0 , 1 >> object_descriptors
。
像这样:
for (auto & element : object_descriptors){
bsoncxx::document::value document = bsoncxx::builder::basic::make_document
(kvp("file_name", files[file_count++]),
kvp("objectID" , serialize??(element) ); //i couldnt figure out the proper way.
kvp("created_at", bsoncxx::types::b_date(std::chrono::system_clock::now()));
bsoncxx::stdx::optional<mongocxx::result::insert_one> result =
coll.insert_one(document.view());
auto v = document.view();
element.size();
}
发布于 2018-01-25 18:03:29
你的问题实际上有三个部分。
从本质上讲,第一个问题是如何将矩阵对象序列化为BSON?不出所料,答案是“视情况而定”。从逻辑上讲,您需要决定应该对哪些信息进行编码以及以何种格式进行编码。你想要一个数组编码的数组吗?按什么顺序?或者矩阵是稀疏的,所以某种列表结构会更好?如何将一个矩阵编码为JSON/BSON由您决定。
第二个问题是,给定问题1的答案,如何调用bsoncxx
构建器库来进行编码。我认为您的问题的答案是,您将想要编写一些帮助程序,并使用将可调用对象附加到构建器的功能。有关如何做到这一点的一些见解,请参阅stream customization example。该特定示例使用当前去加重的流操作,但相同的技术也适用于您正在使用的基本构建器。
第三个问题是,如何从查询中返回的BSON文档重组矩阵对象。这将再次取决于您选择作为第一个问题的答案的BSON的结构。您将需要使用迭代器API遍历视图上返回的BSON对象,并逐步构建您的矩阵对象。
如果这一切听起来像是大量的工作,那是因为它确实如此。自动化这个获取语言级对象并将其序列化到数据库中或从数据库中反序列化的过程的框架称为OxMs,其中X可以是关系数据库的“R”,或者文档数据库的“D”。
目前还没有针对MongoDB的官方支持的C++ ODM。但是,在mongo-cxx驱动程序之上有一个名为mangrove的C++14 ODM的实验版本和未维护版本。虽然我不推荐实际使用它,因为它是未维护的,但您可能会发现,阅读它可以提供一些灵感,告诉您如何为您关心的类型构建一个简单的领域特定ODM样层,而不需要手动执行每个序列化或反序列化例程。
https://stackoverflow.com/questions/48448744
复制