gpt4 book ai didi

海量数据批量插入的C++ MongoClient索引优化

转载 作者:可可西里 更新时间:2023-11-01 10:44:06 24 4
gpt4 key购买 nike

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

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

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

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

非常感谢您的帮助!

最佳答案

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

  1. 显然,如果需要,您可以通过从 DbClientWithCommands ( documentation ) 扩展方法 createCollection 来禁用集合的 _id类(class)。当然,您还需要确保 _id 不会由驱动程序自动插入(许多驱动程序都这样做,所以对于某些人来说,这仍然是一个问题)。
  2. 当前的驱动程序方法 ensureIndex 有一个 background 参数,您可以提供 ( documentation )
  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);
}

关于海量数据批量插入的C++ MongoClient索引优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19702319/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com