その4。大量インサートとかインデックス。↓ソース

//ためし用のクラス
public class TestDoc
{
    public ObjectId Id { get; set; }
    public int 連番 { get; set; }
    public string ボディ { get; set; }
}
//1000万件オブジェクト作って、普通にInsertMany
List documents = new List();
for (int i = 0; i < 10000000; i++)
{
    documents.Add(
            new TestDoc { 連番 = i, ボディ ="あいうえおかきくけこ" }
        );
}
collection.InsertMany(documents);//2m57s789
//1000万件オブジェクト作って、BulkInsert
var models = new List>();
for (int i = 0; i < 10000000; i++)
{
    models.Add(
            new InsertOneModel(new TestDoc { 連番 = i, ボディ = "あいうえおかきくけこ" })
        );
}
collection = database.GetCollection("TestDocBulk");
collection.BulkWrite(models);//2s41m349
//1000万件を10万件毎にBulkInsert
var models = new List>();
for (int i = 0; i < 10000000; i++)
{
    models.Add(
            new InsertOneModel(new TestDoc { 連番 = i, ボディ = "あいうえおかきくけこ" })
        );
    if(i % 100000 == 0 && i != 0)
    {
        collection.BulkWrite(models);
        models.Clear();
    }
}
//2m37s157

InsertManyとBulkWriteに大差がないとゆー。Bulkは何かで使えるのだろーか。 もうちょっと複雑なドキュメントとかだと意味あるのかしら。。。 ある程度のまとまりに分けてインサートすると、メモリがアホみたいに増えないので、時間的な差があまりなさそーだし、やっぱこっちのほうがいいかな。次はFind。Bulkで作ったコレクションで試す(1000万レコード)。

//インデックスなし
var finddocument = collection.Find(new BsonDocument { { "連番", 12345 } });
long count = finddocument.Count();// ⇒ 4s045
List listTmp = finddocument.ToList();// ⇒ 3s686
//インデックスつける
collection.Indexes.CreateOne(new BsonDocument("連番", 1));
//同じのもう一回
var finddocument = collection.Find(new BsonDocument { { "連番", 12345 } });
long count = finddocument.Count();// ⇒ 0s088
List listTmp = finddocument.ToList();// ⇒ 0s013

インデックス無いとやっぱ使いものにならないす。インデックスつけてよーやくいい感じ。

なんとなくつかめてきたので、後は実地でいろいろ試してみよう。