MongoDB се предлага с всички усъвършенствани функции за генериране на ObjectId, но често просто прескачате кораба от релационна база данни и все още искате лесно за четене/общуване поле за числов идентификатор, което автоматично се увеличава всеки път, когато се вмъкне нов запис.
Едно красиво предложение от урока на MongoDB е да използвате колекция от броячи с „име на брояча“ като идентификатор и поле „seq“ за съхраняване на последното използвано число.
Когато разработвате с помощта на 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 Repository), просто задайте полето за идентификатор по този начин, преди да го запазите
BaseQuestion baseQuestion = new BaseQuestion();
baseQuestion.setQuestionId(nextSequenceService.getNextSequence("customSequences"));
/* Rest all values */
baseQuestionRepository.save(baseQuestion);
Ако не ви харесва този начин, тогава трябва да използвате MongoDBEvents и да използвате onBeforeConvert, за да генерирате автоматизирана стойност, като използвате същия подход по-горе.
Също така подходът по-горе е безопасен за нишки, тъй като findAndModify() е атомен метод, безопасен за нишки