MongoDB hadir dengan semua fitur pembuatan ObjectId yang canggih, tetapi seringkali Anda baru saja melompat dari database relasional, dan Anda masih menginginkan bidang pengenal numerik yang mudah dibaca / dikomunikasikan yang secara otomatis bertambah setiap kali catatan baru dimasukkan.
Salah satu saran bagus dari tutorial MongoDB adalah menggunakan koleksi penghitung dengan 'nama penghitung' sebagai id-nya, dan bidang 'seq' untuk menyimpan nomor yang terakhir digunakan.
Saat mengembangkan menggunakan Spring Data MongoDB, trik rapi ini dapat ditulis sebagai layanan sederhana. Disini saya menggunakan nama koleksi sebagai counter name agar mudah ditebak/diingat.
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 hanyalah kelas sederhana yang mewakili koleksi. Harap berhati-hati dengan penggunaan tipe data int, ini akan membatasi maksimum 2^31 entri.
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
}
Kemudian ketika memasukkan entri baru (dengan bantuan dukungan Spring MongoDB Repository), setel saja bidang id seperti ini sebelum Anda menyimpannya
BaseQuestion baseQuestion = new BaseQuestion();
baseQuestion.setQuestionId(nextSequenceService.getNextSequence("customSequences"));
/* Rest all values */
baseQuestionRepository.save(baseQuestion);
Jika Anda tidak menyukai cara ini maka Anda perlu menggunakan MongoDBEvents dan menggunakan onBeforeConvert untuk menghasilkan nilai otomatis menggunakan pendekatan yang sama di atas.
Juga pendekatan di atas adalah threadsafe karena findAndModify() adalah metode atom yang aman untuk thread