4

背景:

私はmongo-elasticsearch川を介してElasticSearchと連携してMongoDBを使用しています。Elasticsearch では、ドキュメントの構造を次のようにしたいと考えています。

{
    "_id": "SomeId-AnotherId",

    ... // all the other lovely denormalized data
}

SomeId-AnotherId は、データを非正規化するときに作成するものです。この構造が必要な理由はhttp://elasticsearch/index/type/SomeId-AnotherId、ドキュメントを取得するために言うことができる必要があるからです。

データ (C# アプリ) を非正規化してから、MongoDB に挿入します (このデータは、前述のように、川を介して ES に入ります)。MongoDB に挿入するとき、現在、Mongo がドキュメントのインデックス作成に使用するモデルに BsonId を設定する必要があるという印象を受けています。[BsonId] 属性を追加する限り、これは ObjectId または string や int などの他の型にすることができます。

私のモデルは次のようになります。

public class Model {
    [BsonId]
    public string Id {get;set;}
}

そして、私はそれを次のように設定しました:

model.Id = string.format("{0}-{1}", someId, anotherId);

問題

現時点では、10,000 までの挿入から 1,500 までのドキュメントが Mongo に取り込まれています。モデル オブジェクト用に生成していた ID を確認したところ、12 バイトをはるかに超えていました。モンゴはそれらを拒否し、書かないでしょうか?

Bson Id は 12 バイトです。これは、独自の ID ("SomeId-AnotherId" の形式) を作成する場合、長さも 12 バイトにする必要があるということですか? とにかくこのあたり?

上記のように、ドキュメントがelasticsearchに入ったら、特定の方法でドキュメントを取得できるようにしたいので、これらのドキュメントにmongosのデフォルトobjectIdを使用したくありません(URIで「SomeId-AnotherId」を使用)。

最終的な注意:

ElasticId などと呼ばれる別の ID プロパティをモデルに追加し、Elasticsearch を構成してこのプロパティを探し、elasticsearch ドキュメントの _id として使用できることを認識しています。これを行うと、Mongos のデフォルト ID を使用でき、すべてがうまくいきます。ただし、elasticsearch のパフォーマンスを犠牲にし、必要のない追加のフィールドをエラスティック検索に格納する必要があります。

大規模なブレイン ダンプで申し訳ありません。:)

4

2 に答える 2

9

_idMongoDBドキュメントのフィールドは12バイトのUUIDにすることができますが、そうである必要はありません。ドキュメントによると、配列以外の値は_id、一意であることを確認できる限り、として使用できます。

于 2012-11-27T15:33:48.613 に答える
4

OK、これで解決しました。振り返ってみると、それは少し明白であり、私の側の大きな見落としでした。

10,000 のバッチで挿入していますが、レコードの総数は 4000 万を超えています。私のIDはバッチごとに一意であることが保証されていたので、他のバッチで重複する可能性がありました.

私は SafeMode をオンにして、取得していた例外を確認し始めました - それらは mongo から来ており、それらは重複キーの例外でした。重複キー エラーが発生するとすぐに、mongo csharp クライアントがバッチ内の残りのデータをすべて削除することがわかりました。そのため、バッチの最初の 1500 が入ってくるのを見ていましたが、重複キー エラーが発生し、残りのバッチが挿入されませんでした。これは完全に理にかなっています。

したがって、今のところ、実際にはバッチ挿入とほぼ同じ速さの単一挿入を行っています。重複キー エラーが発生した場合はログに記録しますが、シナリオでは重複を気にしないので続行します。

助けてくれてありがとう@Philipp。

于 2012-11-28T13:31:13.290 に答える