如何检查mongocxx中collection.create_index()的执行是否成功?
解决mongocxx创建索引后的成功检查问题
我来帮你搞定这个问题!你遇到的打印异常是因为直接访问了BSON文档的原始二进制数据,而正确的检查方式其实很简单,下面一步步给你说明:
1. 最直接的方式:通过异常捕获判断操作成败
mongocxx的create_index方法在执行失败时(比如索引格式错误、权限不足、集合不存在等),会直接抛出mongocxx::exception异常,所以用try-catch块包裹代码,就能快速判断操作是否成功:
#include <mongocxx/client.hpp> #include <mongocxx/instance.hpp> #include <bsoncxx/builder/stream/document.hpp> #include <bsoncxx/json.hpp> #include <iostream> int main() { mongocxx::instance instance{}; mongocxx::client client{mongocxx::uri{}}; auto coll = client["your_db"]["your_collection"]; try { // 创建复合索引的代码 auto index_specification = bsoncxx::builder::stream::document{} << "_tablename" << 1 << "rowuuid" << 1 << bsoncxx::builder::stream::finalize; auto result = coll.create_index(std::move(index_specification)); // 走到这里说明创建成功了! std::cout << "✅ 索引创建成功!返回的索引详情:" << std::endl; // 正确打印返回的BSON文档(转成JSON格式) std::cout << bsoncxx::to_json(result.view()) << std::endl; } catch (const mongocxx::exception& e) { // 捕获到异常说明操作失败 std::cerr << "❌ 创建索引失败:" << e.what() << std::endl; return 1; } return 0; }
2. 为什么你之前的打印只得到&字符?
你用printf((const char*) result.view().data());打印的是BSON文档的原始二进制缓冲区,这不是可读的文本字符串,所以输出乱码或者奇怪的字符(比如你看到的&)是正常的。要把BSON转换成人类可读的格式,需要用bsoncxx::to_json()函数,它会把BSON文档转换成标准的JSON字符串,方便你查看索引的名称、键结构等信息。
3. 额外验证:检查集合的索引列表
如果你想进一步确认索引确实存在,可以通过coll.list_indexes()获取集合的所有索引,然后遍历检查你创建的复合索引是否在列表中:
// 获取所有索引 auto indexes = coll.list_indexes(); bool index_found = false; for (auto&& index_doc : indexes) { // 获取索引的键结构 auto index_keys = index_doc["key"].get_document().value; // 检查是否是我们创建的_tablename:1 + rowuuid:1的复合索引 auto tablename_it = index_keys.find("_tablename"); auto rowuuid_it = index_keys.find("rowuuid"); if (tablename_it != index_keys.end() && tablename_it->get_int32().value == 1 && rowuuid_it != index_keys.end() && rowuuid_it->get_int32().value == 1) { index_found = true; std::cout << "✅ 验证通过:索引已存在,详情:" << std::endl; std::cout << bsoncxx::to_json(index_doc) << std::endl; break; } } if (!index_found) { std::cerr << "❌ 验证失败:未找到目标索引!" << std::endl; }
这样就能双重确认索引是否成功创建啦!
内容的提问来源于stack exchange,提问作者QLands - Carlos Quiros
相关产品推荐
相关产品推荐

