MongoDB具备所有复杂的ObjectId生成功能,但是通常您只是从关系数据库中跳了出来,而且您仍然想要一个易于读取/交流的数字标识符字段,该字段在每次插入新记录时都会自动递增。
MongoDB教程中的一项巧妙建议是使用一个计数器集合,该计数器集合以“ counter name”作为其ID,并使用“
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;@Servicepublic 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支持),只需在保存之前像这样设置id字段
baseQuestion baseQuestion = new baseQuestion();baseQuestion.setQuestionId(nextSequenceService.getNextSequence("customSequences"));baseQuestionRepository.save(baseQuestion);如果您不喜欢这种方式,则需要使用MongoDBEvents并使用与上述相同的方法使用onBeforeConvert来生成自动值。
同样上述方法也是线程安全的,因为findAndModify()是线程安全的原子方法



