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()はスレッドセーフなアトミックメソッドであるため、上記のアプローチはスレッドセーフです