2

高頻度で MongoDB にデータを挿入するアプリケーションを開発しています (数千のドキュメントが 1 秒未満)。そのため、インデックスとストレージ スペースの最適化が重要です。

したがって、最初のレコード (コレクション名は動的) を挿入する前に、C++ ドライバーで次のことを行いたいと思います。

  • _id の autoindex をオフにします (_id フィールドとしてサブドキュメントがあります)、C++ ドライバーでそれを行う方法がわかりません
  • 1 つの特別なインデックスを確保してください。conn.ensureIndex(coll, mongo::fromjson("{'_id.o':1}"));
  • インデックスをバックグラウンドに設定します (C++ ドライバーでそれを行う方法がわからない)
  • パディングをゼロに設定します (ドキュメントは二度と更新されません) C++ ドライバーでそれを行う方法がわからない

私の挿入コマンドは、conn.insert(coll, vec);明らかに任意の数のベクトル要素に対して正常に機能します。

助けていただければ幸いです。

4

1 に答える 1

1

_idインデックスを削除して別のインデックスに置き換えながら、_idフィールドを設定している理由がわかりません。

  1. どうやら、 ( documentation ) クラスから_idメソッドを拡張することにより、必要に応じてコレクションの を無効にすることができます。もちろん、ドライバーによって が自動的に挿入されないようにする必要もあります (多くのドライバーがこれに対応しているため、一部の人にとっては、これは依然として問題になります)。createCollectionDbClientWithCommands_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);
}
于 2013-10-31T12:47:26.653 に答える