একটি mongoDB ডাব্লু / জাভা ড্রাইভারের মধ্যে সর্বশেষ documentোকানো নথির আইডি পান


104

জাভা ড্রাইভারটি ব্যবহার করে কোনও মঙ্গোডিবি ইভেন্টের সর্বশেষ সন্নিবেশকৃত নথির আইডি (অবজেক্টআইডি) পাওয়ার কী সহজ উপায় আছে?

উত্তর:


192

আমি বুঝতে পেরেছি আপনি এটি করতে পারেন:

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

13

ক এবং একটি দেওয়া থেকে কাস্টিং এড়ানোর Objectজন্য , আপনি নিম্নলিখিতগুলি করতে পারেন:ObjectIdcom.mongodb.client.MongoCollection collectionorg.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
কোনও কারণে, মোঙ্গোডিবি ২.২.২ এ (আগে আমি যখন ২.২.০-তে ছিলাম তার বিপরীতে) এবং জাভা ড্রাইভারের সাথে ২.১০.১, উত্তরের কোডটি কার্যকর হয় না; আমি নথিতে বস্তুটি উত্থাপিত করার পরেও, আমি এর _id পাচ্ছি না, যদিও মঙ্গোডিবি স্পষ্টভাবে অবজেক্টআইডের স্বয়ংক্রিয়ভাবে জেনারেট করে। তবে ম্যানুয়ালি একটি অবজেক্টআইডি তৈরি করার আপনার সমাধানটি কাজ করে এবং এই বিকল্পটির জন্য ধন্যবাদ!
এপোফেনিয়া ওভারলোড

<কোড> বেসিকডিবিওজেক্ট ডক = নতুন বেসিকডিবিবজেক্ট ("_ আইডি", নতুন অবজেক্টআইডি ()); System.out.println ("doc.id এর আগে:" + doc.get ("_ id")); নতুন মঙ্গো ("লোকালহোস্ট")। getDB ("পরীক্ষা") get get get সংগ্রহ ("t") inোকান (ডক); System.out.println ("doc.id after:" + doc.get ("_ id")); </code> এই কোডটি আমার পক্ষে ভাল কাজ করে, নতুন সংস্করণে পরীক্ষা করা হয়েছে মঙ্গো ২.২.২, ড্রাইভার 2.10.1
জ্লোব

7

আমি জাভা ড্রাইভার সম্পর্কে জানি না তবে উত্তরোত্তর জন্য, getLastError কমান্ডটি লেখার _id এমনকি একটি উপস্থাপনা (1.5.৪.৪ হিসাবে) পেতে চালানো যেতে পারে


4

মংগোডিবি সংগ্রহের মধ্যে একটি নথি সন্নিবেশ করার পরে, সফল সন্নিবেশের জন্য প্রয়োজনীয় ক্ষেত্রগুলি (যেমন _ _) আপডেট করা উচিত। আপনি _id এর জন্য objectোকানো বস্তুটি জিজ্ঞাসা করতে পারেন।


0

মঙ্গোমেম্পলেট.ক্লাসে একটি পদ্ধতি আছে

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);
}

আমরা দেখতে পাচ্ছি যে সত্তাটি বেসিকডিবিঅজেক্টের একটি উপ-শ্রেণি, এটি আমাদের জন্য একটি আইডি সেট করবে।


0

আমি মনে করি এর উত্তরটি "না"।

আপনি যা করতে পারেন তা হ'ল _idম্যানুয়ালি আপনার নিজের সরবরাহ করা, বা CollectibleCodecপ্রক্রিয়াটি বাস্তবায়ন করা (যা হুবহু ঠিক তাই BasicBDDocumentকরে)। তবে এই সমস্ত সমাধান আইডি ক্লায়েন্টাইড উত্পন্ন জড়িত।

এটি বলে, আমি মনে করি না যে _idক্লায়েন্টাইড উত্পন্ন করতে কোনও সমস্যা আছে ।


-2

এটি sertোকানো অপারেশন:

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

Sertোকানোর পরে আপনি সর্বশেষ idোকানো আইডি পান:

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);

মানটি ইন্টার টাইপে রূপান্তরিত হওয়ার পরে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.