代码之家  ›  专栏  ›  技术社区  ›  Matt W

获取mongoDB w/Java驱动程序中最后插入的文档的ID

  •  93
  • Matt W  · 技术社区  · 14 年前

    有没有一种简单的方法可以使用Java驱动程序获取mongoDB实例最后插入的文档的ID(ObjectID)?

    7 回复  |  直到 14 年前
        1
  •  195
  •   Paolo Forgia panoet    6 年前

    我刚意识到你可以做到:

    BasicDBObject doc = new BasicDBObject( "name", "Matt" );
    collection.insert( doc );
    ObjectId id = (ObjectId)doc.get( "_id" );
    
        2
  •  14
  •   Jadiel de Armas    8 年前

    避免从 Object ObjectId ,给定 com.mongodb.client.MongoCollection collection 和一个 org.bson.Document doc

    collection.insert(doc);
    ObjectId id = doc.getObjectId("_id");
    
        3
  •  12
  •   zlob    12 年前

    这样做是安全的

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

    如果你看一下司机代码

    if ( ensureID && id == null ){
        id = ObjectId.get();
        jo.put( "_id" , id );       
    }
    
    public static ObjectId get(){
        return new ObjectId();
    }
    
        4
  •  7
  •   chx    14 年前

    我不知道Java驱动程序,但是对于后代来说,可以运行getLastError命令来获取写入的\u id,甚至是upsert(从1.5.4开始)

        5
  •  4
  •   Ramesh    13 年前

    将文档插入MongoDB集合后,成功的插入应该更新必需的字段(即_id)。您可以在插入的对象中查询\u id。

        6
  •  0
  •   Z.Billy    8 年前

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

    该方法将为我们设置id

    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的子类,它将为我们设置一个id。

        7
  •  0
  •   Matthew    6 年前

    我想答案是“不”。

    _id 你自己,或者手动,或者实现 CollectibleCodec 机制(到底是什么 BasicBDDocument 是的)。然而,所有这些解决方案都涉及到生成ID clientside。

    话虽如此,我认为生成 _身份证 客户端。

        8
  •  0
  •   Anand Namastemath    4 年前
    1. 使用大容量插入时

    1. 使用单个镶件时

        9
  •  -2
  •   user27    12 年前

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

    插入后获取上次插入的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);
    

    获取值后转换为inter类型。