MongoDB đi kèm với tất cả tính năng tạo ObjectId phức tạp, nhưng thường thì bạn chỉ cần chuyển từ cơ sở dữ liệu quan hệ và bạn vẫn muốn có một trường định danh số dễ đọc / giao tiếp. Trường này sẽ tự động tăng lên mỗi khi bản ghi mới được chèn vào.
Một gợi ý tuyệt vời từ hướng dẫn MongoDB là sử dụng bộ sưu tập bộ đếm với "tên bộ đếm" làm id của nó và trường "seq" để lưu trữ số được sử dụng gần đây nhất.
Khi phát triển bằng cách sử dụng Spring Data MongoDB, thủ thuật nhỏ gọn này có thể được viết như một dịch vụ đơn giản. Ở đây, tôi đã sử dụng tên bộ sưu tập làm tên bộ đếm để dễ đoán / dễ nhớ.
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 chỉ là một lớp đơn giản đại diện cho bộ sưu tập. Hãy cẩn thận với việc sử dụng kiểu dữ liệu int, điều này sẽ giới hạn tối đa 2 ^ 31 mục nhập.
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
}
Sau đó, khi chèn một mục mới (với sự trợ giúp của Spring MongoDB Repository hỗ trợ), chỉ cần đặt trường id như thế này trước khi bạn lưu nó
BaseQuestion baseQuestion = new BaseQuestion();
baseQuestion.setQuestionId(nextSequenceService.getNextSequence("customSequences"));
/* Rest all values */
baseQuestionRepository.save(baseQuestion);
Nếu bạn không thích cách này thì bạn cần sử dụng MongoDBEvents và sử dụng onBeforeConvert để tạo giá trị tự động bằng cách sử dụng cùng phương pháp ở trên.
Ngoài ra, cách tiếp cận ở trên là threadsafe vì findAndModify () là một phương thức nguyên tử an toàn cho luồng