-3

私はMongoDBが初めてで、基本的な要件に対するいくつかの解決策を見つけようとしています。

シナリオは次のとおりです。スケジューラを介して MongoDB に情報を保存するアプリケーションがあります。スケジューラが実行されるたびに、db から最後に挿入されたドキュメントを取得して、次の情報セットを取得するためにリクエストで送信する必要がある最後の情報 ID を取得する必要があります。また、オブジェクトを保存するときは、フィールドの特定の値が db に既に存在するかどうかを検証する必要があります。存在する場合は、そのドキュメントのカウントを更新するか、新しいものを保存する必要があります。

私の質問は次のとおりです。

  • MongoDB Java ドライバーを使用しています。オブジェクト ID を自分で生成するのが良いですか、それともドライバーまたは MongoDB 自体から生成されたものを使用するのが良いですか?

  • 最後に挿入されたドキュメントを取得して、最後に処理された情報 ID を見つける最良の方法は何ですか?

  • 各挿入の前に列の特定の値を検索すると、何千ものレコードがあるはずなので、アプリケーションのパフォーマンスが心配です。この検証を行う最善の方法は何ですか?

  • 挿入を行うときに 2 つの書き込みについて話している場所をいくつか見ました。1 つはドキュメントをコレクションに書き込み、もう 1 つは最後に挿入されたエントリを追跡するために最終更新として別のコレクションに書き込みます。これは良い方法ですか?通常、リレーショナル データベースではこれを行いません。

  • 生成されたオブジェクト ID が、今後挿入されるすべてのレコードに対して一意であると期待できますか? (リピートできるかどうかは疑問)

    ありがとう。

4

1 に答える 1

1

生成されたオブジェクト ID が、今後挿入されるすべてのレコードに対して一意であると期待できますか? (リピートできるかどうかは疑問)

MongoDB Java ドライバーを使用しています。オブジェクト ID を自分で生成するのが良いですか、それともドライバーまたは MongoDB 自体から生成されたものを使用するのが良いですか?

ドキュメントのオブジェクト ID を指定しない場合、mongo が自動的に生成します。すべてのドキュメントには必ず _id が必要です。関連リファレンスはこちらです。

The relevant part is
    ObjectId is a 12-byte BSON type, constructed using:
    
    a 4-byte value representing the seconds since the Unix epoch,
    a 3-byte machine identifier,
    a 2-byte process id, and
    a 3-byte counter, starting with a random value.

http://docs.mongodb.org/manual/reference/object-id/

これは十分なランダム化だと思います(ただし、日付/時刻が単調に増加するため、ハッシュの選択は不十分です)

各挿入の前に列の特定の値を検索すると、何千ものレコードがあるはずなので、アプリケーションのパフォーマンスが心配です。この検証を行う最善の方法は何ですか?

最初にフィールドにインデックスを付けます (mongodb には列がありません。2 つのドキュメントが異なるフィールドを持つことができます)。

   db.collection_name.ensureIndex({fieldName : 1})

最後に挿入されたドキュメントを取得して、最後に処理された情報 ID を見つける最良の方法は何ですか?

楽しい事実。一度使用してからドキュメントを削除する場合は、info id フィールドは必要ありません。_id フィールドは日付ごとにソートされます。ただし、ドキュメントが定期的に更新される場合は、検索および変更操作でドキュメントをアトミックに変更する必要があります。

http://api.mongodb.org/java/2.6/com/mongodb/DBCollection.html#findAndModify%28com.mongodb.DBObject,%20com.mongodb.DBObject,%20com.mongodb.DBObject,%20boolean,%20com. mongodb.DBObject、%20ブール値、%20ブール値%29

これで、最後に挿入/変更されたドキュメントの日付が更新されました。このフィールドがインデックス化されていることを確認してください。上記のリンクを使用して、並べ替えパラメーターを探し、それを入力します

    new BasicDbObject().put("infoId", -1); //-1 is for descending order.

挿入を行うときに2つの書き込みについて話している場所がいくつかありました。1つはドキュメントをコレクションに書き込み、もう1つは最後に挿入されたエントリを追跡するために最終更新として別のコレクションに書き込みます。これは良い方法ですか?通常、リレーショナル データベースではこれを行いません。

ひどいアイデア!ようこそモンゴへ。あなたはこれよりもうまくやることができます。

于 2013-07-07T11:03:08.203 に答える