C++ Mongo客户端索引优化,用于海量数据批量插入
C++ MongoClient index optimization for mass data bulk inserts
我正在开发一个应用程序,它以高频率(数千个文档亚秒)将数据插入MongoDB。因此,索引和存储空间优化是关键。
因此,在插入第一条记录(集合名称是动态的)之前,我想使用 C++ 驱动程序执行以下操作:
- 关闭_id上的自动索引(我有一个子文档作为_id字段),不知道如何使用C++驱动程序执行此操作
- 确保一个特殊的索引,这适用于
conn.ensureIndex(coll, mongo::fromjson("{'_id.o':1}"));
- 将索引设置为背景(不知道如何使用C++驱动程序执行此操作)
- 将填充设置为零(文档永远不会再次更新)不知道如何使用C++驱动程序执行此操作
然后conn.insert(coll, vec);
我的插入命令,这显然适用于任意数量的矢量元素。
非常感谢帮助!
我不确定我是否理解为什么要删除_id
索引并将其替换为另一个索引,但仍设置_id
字段。
- 显然,如果需要,您可以通过扩展
DbClientWithCommands
(文档)类中的方法createCollection
来禁用集合的_id
。当然,您还需要确保驱动程序不会自动插入_id
(许多驱动程序对此,因此对于某些人来说,这仍然是一个问题)。 - 当前的驱动程序方法
ensureIndex
具有可以提供的background
参数(文档) - 我不知道有任何方法可以以编程方式控制填充。它由MongoDB随着时间的推移自动确定集合。如果您不修改文档,我希望它接近 1(意味着没有填充)。检查统计数据以确保。
要创建没有_id
并使用autoIndexId
的集合,您需要创建一个新函数,就像内置函数当前所做的那样,您需要复制上述代码并执行以下操作:
bool MyClass::createCollection(const string &ns, long long size,
bool capped, int max, bool disableAutoIndexId, BSONObj *info) {
verify(!capped||size);
BSONObj o;
if ( info == 0 ) info = &o;
BSONObjBuilder b;
string db = nsToDatabase(ns);
b.append("create", ns.c_str() + db.length() + 1);
if ( size ) b.append("size", size);
if ( capped ) b.append("capped", true);
if ( max ) b.append("max", max);
if ( disableAutoIndexId ) b.append("autoIndexId", false);
return runCommand(db.c_str(), b.done(), *info);
}
相关文章:
- 逐行读取文件,并将数据插入变量和数组中
- Qt & SqlLite 将数据插入数据库
- C++ - 将数据插入到地图循环的地图中
- SQLite C/C++ 接口:将数据插入表时内存增加
- C++将 X 向量数据插入到另一个向量
- 如何通过 C 变量将数据插入表中
- 将数据插入一些复杂的数据结构-C
- 将数据插入C 中的文本文件中
- 如何通过c++中的应用程序将数据插入solr
- 在Windows上将数据插入文件
- C++链表——如何将每个新数据插入尾部
- C++链表实现多数据插入
- 在c++中,将数据插入到文件中的特定位置而不进行覆盖
- C++内存从将数据插入链表中泄漏
- 将数据插入多维向量并进行排序
- WINAPI SQLite C无法正确地将数据插入数据库
- 参照同一矢量的数据插入矢量
- PostgreSQL字节二进制数据插入
- Cuda有效地将数据插入到未排序的填充数组中
- 使用 ADO 将原始文件数据插入访问表的 BLOB("OLE 对象")字段