एक mongoDB w / Java ड्राइवर में अंतिम सम्मिलित दस्तावेज़ की ID प्राप्त करें


104

क्या जावा ड्राइवर का उपयोग करके एक मोंगोडीबी उदाहरण के अंतिम सम्मिलित दस्तावेज़ की आईडी (ऑब्जेक्ट) प्राप्त करने का एक आसान तरीका है?

जवाबों:


192

मुझे सिर्फ एहसास हुआ कि आप ऐसा कर सकते हैं:

BasicDBObject doc = new BasicDBObject( "name", "Matt" );
collection.insert( doc );
ObjectId id = (ObjectId)doc.get( "_id" );

13

कास्टिंग से बचने के Objectलिए ObjectId, ए com.mongodb.client.MongoCollection collectionऔर ए को देखते हुए org.bson.Document doc, आप निम्न कार्य कर सकते हैं:

collection.insert(doc);
ObjectId id = doc.getObjectId("_id");

मुझे लगता है कि यह 3.x जावा ड्राइवर में संभव हो गया है?
जोंतिया १२

12

यह करना सुरक्षित है

doc.set("_id", new ObjectId())

अगर आप ड्राइवर कोड देखते हैं

if ( ensureID && id == null ){
    id = ObjectId.get();
    jo.put( "_id" , id );       
}

public static ObjectId get(){
    return new ObjectId();
}

क्या आपके कहने का मतलब है it's save to doया it's safe to do?
pd40

1
किसी कारण से, MongoDB 2.2.2 में (जैसा कि पहले जब मैं 2.2.0 पर था) के विरोध में और जावा ड्राइवर 2.10.1 के साथ, उत्तर में कोड काम नहीं करता है; जब मैं ऑब्जेक्ट को दस्तावेज़ में रखता हूं, तो मुझे इसका _id नहीं मिल रहा है, भले ही MongoDB स्पष्ट रूप से ObjectId का स्वतः उत्पन्न करता है। हालाँकि, मैन्युअल रूप से ObjectId बनाने का आपका समाधान काम करता है, और इस विकल्प के लिए धन्यवाद!
एपोफेनिया अधिभार

<code> BasicDBObject doc = new BasicDBObject ("_ id", new ObjectId ()); System.out.println ("पहले doc.id:" + doc.get ("_ id")); new Mongo ("localhost")। getDB ("परीक्षण")। getCollection ("t")। सम्मिलित करें (डॉक्टर); System.out.println ("के बाद doc.id:" + doc.get ("_ id")); </ code> मेरे लिए यह कोड अच्छी तरह से काम करता है, नए संस्करणों पर परीक्षण किया गया है
mongo

7

मुझे जावा ड्राइवर के बारे में नहीं पता है, लेकिन पोस्टरिटी के लिए, getLastError कमांड को राइट ऑफ, राइट अपियरेंट (1.5.4 के रूप में) पाने के लिए चलाया जा सकता है।


4

एक दस्तावेज़ को MongoDB संग्रह में सम्मिलित किए जाने के बाद, सफल प्रविष्टि को आवश्यक फ़ील्ड (अर्थात _id) को अपडेट करना चाहिए। आप _id के लिए सम्मिलित ऑब्जेक्ट को क्वेरी कर सकते हैं।


0

MongoTemplate.class में एक विधि है

protected <T> void doInsert(String collectionName, T objectToSave, MongoWriter<T> writer) {

    assertUpdateableIdIfNotSet(objectToSave);

    initializeVersionProperty(objectToSave);

    maybeEmitEvent(new BeforeConvertEvent<T>(objectToSave, collectionName));

    DBObject dbDoc = toDbObject(objectToSave, writer);

    maybeEmitEvent(new BeforeSaveEvent<T>(objectToSave, dbDoc, collectionName));
    Object id = insertDBObject(collectionName, dbDoc, objectToSave.getClass());

    populateIdIfNecessary(objectToSave, id);
    maybeEmitEvent(new AfterSaveEvent<T>(objectToSave, dbDoc, collectionName));
}

और विधि हमारे लिए आईडी सेट करेगी

protected void populateIdIfNecessary(Object savedObject, Object id) {

    if (id == null) {
        return;
    }

    if (savedObject instanceof BasicDBObject) {
        DBObject dbObject = (DBObject) savedObject;
        dbObject.put(ID_FIELD, id);
        return;
    }

    MongoPersistentProperty idProp = getIdPropertyFor(savedObject.getClass());

    if (idProp == null) {
        return;
    }

    ConversionService conversionService = mongoConverter.getConversionService();
    MongoPersistentEntity<?> entity = mappingContext.getPersistentEntity(savedObject.getClass());
    PersistentPropertyAccessor accessor = entity.getPropertyAccessor(savedObject);

    if (accessor.getProperty(idProp) != null) {
        return;
    }

    new ConvertingPropertyAccessor(accessor, conversionService).setProperty(idProp, id);
}

हम देख सकते हैं कि क्या इकाई BasicDBObject का उप-वर्ग है, यह हमारे लिए एक आईडी सेट करेगा।


0

मुझे लगता है कि इसका उत्तर "नहीं" है।

आप जो कर सकते हैं _id, वह स्वयं को प्रदान करें , या तो मैन्युअल रूप से करें, या CollectibleCodecतंत्र को लागू करें (जो वास्तव में यही BasicBDDocumentकरता है)। हालाँकि इन सभी समाधानों में आईडी क्लाइंटसाइड बनाना शामिल है।

ऐसा कहने के बाद, मुझे नहीं लगता कि _idक्लाइंटसाइड बनाने में कोई समस्या है ।


-2

यह सम्मिलित ऑपरेशन है:

DBCollection table1 = db.getCollection("Collection name");
BasicDBObject document = new BasicDBObject();
document.put("_id",value);      
document.put("Name", name);
table1.insert(document);

डालने के बाद अंतिम सम्मिलित आईडी प्राप्त करें:

DBCollection tableDetails = db.getCollection("collection name");
BasicDBObject queryDetails = new BasicDBObject();
queryDetails.put("_id", value);
DBCursor cursorDetails =tableDetails.find(queryDetails);
DBObject oneDetails;
oneDetails=cursorDetails.next();        
String data=oneDetails.get("_id").toString();
System.out.println(data);

मान प्राप्त करने के बाद अंतर प्रकार में परिवर्तित करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.