Réponses:
Pour éviter de lancer de Object
vers ObjectId
, étant donné a com.mongodb.client.MongoCollection collection
et a org.bson.Document doc
, vous pouvez effectuer les opérations suivantes:
collection.insert(doc);
ObjectId id = doc.getObjectId("_id");
C'est sûr de faire
doc.set("_id", new ObjectId())
si vous regardez le code du pilote
if ( ensureID && id == null ){
id = ObjectId.get();
jo.put( "_id" , id );
}
public static ObjectId get(){
return new ObjectId();
}
it's save to do
ou it's safe to do
?
Dans MongoTemplate.class a une méthode
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));
}
et la méthode définira l'id pour nous
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);
}
nous pouvons voir si l'entité est une sous-classe de BasicDBObject, elle définira un identifiant pour nous.
Je pense que la réponse à cette question est «non».
Ce que vous pouvez faire est de vous fournir vous- _id
même, soit manuellement, soit d'implémenter le CollectibleCodec
mécanisme (ce qui est exactement ce que BasicBDDocument
fait). Cependant, toutes ces solutions impliquent de générer l'ID côté client.
Cela dit, je ne pense pas qu'il y ait de problème avec la création du côté _id
client.
C'est l'opération d'insertion:
DBCollection table1 = db.getCollection("Collection name");
BasicDBObject document = new BasicDBObject();
document.put("_id",value);
document.put("Name", name);
table1.insert(document);
Après l'insertion, vous obtenez le dernier identifiant inséré:
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);
après avoir obtenu la valeur convertie en type inter.