MongoDB सभी परिष्कृत ObjectId पीढ़ी की सुविधा के साथ आया था, लेकिन अक्सर आप संबंधपरक डेटाबेस से जहाज को कूदते हैं, और आप अभी भी संख्यात्मक पहचानकर्ता फ़ील्ड को पढ़ने/संचार करने में आसान चाहते हैं जो हर बार नया रिकॉर्ड डालने पर स्वचालित रूप से बढ़ता है।
MongoDB ट्यूटोरियल का एक साफ-सुथरा सुझाव है कि 'काउंटर नाम' के साथ एक काउंटर संग्रह का उपयोग इसकी आईडी के रूप में किया जाए, और अंतिम उपयोग की गई संख्या को संग्रहीत करने के लिए एक 'seq' फ़ील्ड का उपयोग किया जाए।
स्प्रिंग डेटा 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
}
फिर एक नई प्रविष्टि डालने पर (स्प्रिंग मोंगोडीबी रिपोजिटरी समर्थन की सहायता से), इसे सहेजने से पहले आईडी फ़ील्ड को इस तरह सेट करें
BaseQuestion baseQuestion = new BaseQuestion();
baseQuestion.setQuestionId(nextSequenceService.getNextSequence("customSequences"));
/* Rest all values */
baseQuestionRepository.save(baseQuestion);
यदि आप इस तरह से पसंद नहीं करते हैं तो आपको MongoDBEvents का उपयोग करने की आवश्यकता है और उसी उपरोक्त दृष्टिकोण का उपयोग करके स्वचालित मूल्य उत्पन्न करने के लिए onBeforeConvert का उपयोग करें।
इसके अलावा उपरोक्त दृष्टिकोण थ्रेडसेफ है क्योंकि findAndModify() एक थ्रेड सुरक्षित परमाणु विधि है