sql >> データベース >  >> NoSQL >> MongoDB

スプリングブートを使用してmongodbの自動生成フィールドを作成するにはどうすればよいですか?

    MongoDBにはすべての高度なObjectId生成機能が付属していますが、多くの場合、リレーショナルデータベースから船を飛び越えただけで、新しいレコードが挿入されるたびに自動的にインクリメントする、読みやすく通信しやすい数値識別子フィールドが必要です。

    MongoDBチュートリアルからの優れた提案の1つは、IDとして「countername」を使用し、最後に使用された番号を格納するために「seq」フィールドを持つcounterコレクションを使用することです。

    Spring Data MongoDBを使用して開発する場合、この巧妙なトリックは単純なサービスとして記述できます。ここでは、コレクション名をカウンター名として使用したので、推測や覚えが簡単です。

    import static org.springframework.data.mongodb.core.FindAndModifyOptions.options;
    import static org.springframework.data.mongodb.core.query.Criteria.where;
    import static org.springframework.data.mongodb.core.query.Query.query;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.mongodb.core.MongoOperations;
    import org.springframework.data.mongodb.core.query.Update;
    import org.springframework.stereotype.Service;
    
    import com.model.CustomSequences;
    
    
    @Service
    public class NextSequenceService {
        @Autowired private MongoOperations mongo;
    
        public int getNextSequence(String seqName)
        {
            CustomSequences counter = mongo.findAndModify(
                query(where("_id").is(seqName)),
                new Update().inc("seq",1),
                options().returnNew(true).upsert(true),
                CustomSequences.class);
            return counter.getSeq();
        }
    }
    

    CustomSequencesは、コレクションを表す単純なクラスです。 intデータ型の使用に注意してください。これにより、最大2^31エントリに制限されます。

    import org.springframework.data.annotation.Id;
    import org.springframework.data.mongodb.core.mapping.Document;
    
    @Document(collection = "customSequences")
    public class CustomSequences {
        @Id
        private String id;
        private int seq;
    
    // getters and setters
    }
    

    次に、(Spring MongoDBリポジトリのサポートを利用して)新しいエントリを挿入するときに、保存する前にこのようにidフィールドを設定するだけです

    BaseQuestion baseQuestion = new BaseQuestion();
    baseQuestion.setQuestionId(nextSequenceService.getNextSequence("customSequences"));
    /* Rest all values */
    
    baseQuestionRepository.save(baseQuestion);
    

    この方法が気に入らない場合は、MongoDBEventsを使用し、onBeforeConvertを使用して、上記と同じアプローチを使用して自動化された値を生成する必要があります。

    また、findAndModify()はスレッドセーフなアトミックメソッドであるため、上記のアプローチはスレッドセーフです




    1. Springブートredis統合テスト用の信頼できるライブラリ

    2. パフォーマンス向上のためのMapReduceのパフォーマンスチューニング

    3. Azure上の高性能MongoDBクラスター

    4. 本番環境でMongoDBを使い始めるときに知っておくべきこと-10のヒント