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

SpringBootを使用したMongoDBの自動生成フィールド

    1。概要

    このチュートリアルでは、SpringBootでMongoDBのシーケンシャルな自動生成フィールドを実装する方法を学習します。

    Spring BootアプリケーションのデータベースとしてMongoDBを使用している場合、 @GeneratedValueは使用できません。 利用できないため、モデルの注釈。 したがって、JPAとSQLデータベースを使用している場合と同じ効果を生み出す方法が必要です。

    この問題の一般的な解決策は簡単です。生成されたシーケンスを他のコレクション用に保存するコレクション(テーブル)を作成します。新しいレコードの作成中に、それを使用して次の値をフェッチします。

    2。依存関係

    次のスプリングブートスターターをpom.xmlに追加しましょう。 :

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <versionId>2.2.2.RELEASE</versionId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
            <versionId>2.2.2.RELEASE</versionId>
        </dependency>
    </dependencies>

    依存関係の最新バージョンは、 spring-boot-starter-parentによって管理されます。 。

    3。コレクション

    概要で説明したように、他のコレクションの自動インクリメントシーケンスを格納するコレクションを作成します。このコレクションをdatabase_sequencesと呼びます。 mongoのいずれかを使用して作成できます シェルまたはMongoDBコンパス。対応するモデルクラスを作成しましょう:

    @Document(collection = "database_sequences")
    public class DatabaseSequence {
    
        @Id
        private String id;
    
        private long seq;
    
        //getters and setters omitted
    }

    次に、ユーザーを作成しましょう コレクション、および対応するモデルオブジェクト。これにより、システムを使用しているユーザーの詳細が保存されます。

    @Document(collection = "users")
    public class User {
    
        @Transient
        public static final String SEQUENCE_NAME = "users_sequence";
    
        @Id
        private long id;
    
        private String email;
    
        //getters and setters omitted
    }

    ユーザー 上で作成したモデルでは、静的フィールド SEQUENCE_NAME、を追加しました これは、ユーザーの自動インクリメントシーケンスへの一意の参照です。 コレクション。

    また、 @Transientで注釈を付けます モデルの他のプロパティと一緒に保持されないようにします。

    4。新しいレコードの作成

    これまでに、必要なコレクションとモデルを作成しました。次に、 idとして使用できる自動インクリメント値を生成するサービスを作成します。 私たちのエンティティのために。

    SequenceGeneratorServiceを作成しましょう generateSequence()があります :

    public long generateSequence(String seqName) {
        DatabaseSequence counter = mongoOperations.findAndModify(query(where("_id").is(seqName)),
          new Update().inc("seq",1), options().returnNew(true).upsert(true),
          DatabaseSequence.class);
        return !Objects.isNull(counter) ? counter.getSeq() : 1;
    }

    これで、 generateSequence()を使用できます。 新しいレコードの作成中:

    User user = new User();
    user.setId(sequenceGenerator.generateSequence(User.SEQUENCE_NAME));
    user.setEmail("[email protected]");
    userRepository.save(user);

    すべてのユーザーを一覧表示するには、 UserRepositoryを使用します :

    List<User> storedUsers = userRepository.findAll();
    storedUsers.forEach(System.out::println);

    現在のように、モデルの新しいインスタンスを作成するたびにidフィールドを設定する必要があります。 Spring Data MongoDBライフサイクルイベントのリスナーを作成することで、このプロセスを回避できます。

    これを行うには、 UserModelListenerを作成します AbstractMongoEventListener を拡張します 次に、 onBeforeConvert()をオーバーライドします :

    @Override
    public void onBeforeConvert(BeforeConvertEvent<User> event) {
        if (event.getSource().getId() < 1) {
            event.getSource().setId(sequenceGenerator.generateSequence(User.SEQUENCE_NAME));
        }
    }

    これで、新しいユーザーを保存するたびに id 自動的に設定されます。


    1. Redis-エラー:値は有効なfloatではありません

    2. AzureでRedisを実行するにはどうすればよいですか?

    3. Javaドライバーを使用したMongoDBアグリゲーション

    4. Mongodbのキーに基づいて重複を削除するにはどうすればよいですか?