2

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

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

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

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

非常感谢您的帮助!

4

1 回答 1

1

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

  1. 显然,如果需要,您可以通过从(文档)类_id扩展方法来禁用集合。当然,您还需要确保驱动程序不会自动插入an(许多驱动程序对此,所以对于某些人来说,这仍然是一个问题)。createCollectionDbClientWithCommands_id
  2. 当前的驱动方法ensureIndex有一个background你可以提供的参数(文档
  3. 我不知道以编程方式控制填充的任何方法。它是由 MongoDB 随时间自动确定的集合。如果您不修改文档,我希望它接近 1(这意味着没有填充)。检查统计数据以确定。

要创建不带_id和 using的集合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);
}
于 2013-10-31T12:47:26.653 回答