C++ Mongo客户端索引优化,用于海量数据批量插入

C++ MongoClient index optimization for mass data bulk inserts

本文关键字:数据 插入 用于海 Mongo 客户端 索引 优化 C++      更新时间:2023-10-16

我正在开发一个应用程序,它以高频率(数千个文档亚秒)将数据插入MongoDB。因此,索引和存储空间优化是关键。

因此,在插入第一条记录(集合名称是动态的)之前,我想使用 C++ 驱动程序执行以下操作:

  • 关闭_id上的自动索引(我有一个子文档作为_id字段),不知道如何使用C++驱动程序执行此操作
  • 确保一个特殊的索引,这适用于conn.ensureIndex(coll, mongo::fromjson("{'_id.o':1}"));
  • 将索引设置为背景(不知道如何使用C++驱动程序执行此操作)
  • 将填充设置为零(文档永远不会再次更新)不知道如何使用C++驱动程序执行此操作

然后conn.insert(coll, vec);我的插入命令,这显然适用于任意数量的矢量元素。

非常感谢帮助!

我不确定我是否理解为什么要删除_id索引并将其替换为另一个索引,但仍设置_id字段。

  1. 显然,如果需要,您可以通过扩展DbClientWithCommands(文档)类中的方法createCollection来禁用集合的_id。当然,您还需要确保驱动程序不会自动插入_id(许多驱动程序对此,因此对于某些人来说,这仍然是一个问题)。
  2. 当前的驱动程序方法ensureIndex具有可以提供的background参数(文档)
  3. 我不知道有任何方法可以以编程方式控制填充。它由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);
}