sintaxis - ¿Cómo realizar operaciones de actualización en GridFS(usando Java)?
update masivo en java (1)
En GridFS no está eliminando / eliminando un solo documento, sino en realidad un montón de documentos (los archivos se dividen en fragmentos y cada fragmento es un documento separado). Eso significa que reemplazar un archivo simplemente no es posible de forma atómica.
Lo que puedes hacer en cambio es:
- inserta un nuevo archivo con un nuevo nombre
- después de que esto ocurra (use la réplica reconocida de escritura-preocupación), actualice todas las referencias al archivo anterior para apuntar al nuevo
- después de obtener una confirmación para esto, puede eliminar el archivo anterior
GridFS es una especie de hackish. A menudo es mejor usar un servidor de archivos separado con un sistema de archivos real para almacenar el contenido del archivo y solo almacenar los metadatos en MongoDB.
Estoy usando Mongo-Java-Driver 2.13
Almacenaba un archivo PDF ( tamaño 30mb ) en GridFS . Puedo realizar la inserción, eliminación y encontrar la operación fácilmente.
MongoClient mongo = new MongoClient("localhost", 27017);
DB db = mongo.getDB("testDB");
File pdfFile = new File("/home/dev/abc.pdf");
GridFS gfs = new GridFS(db,"books");
GridFSInputFile inputFile = gfs.createFile(pdfFile);
inputFile.setId("101");
inputFile.put("title", "abc");
inputFile.put("author", "xyz");
inputFile.save();
los datos se conservan en books.files
y books.chunks
collections. Ahora quiero actualizar :
- Caso 1: archivo pdf
- caso 2: título o autor
¿Cómo realizar estas operaciones de actualización para el Caso 1 en GridFS?
Llegué a saber que necesito mantener múltiples versiones de mis archivos y elegir la versión correcta. ¿Alguien puede aclararlo?
Editar :
Puedo actualizar metadatos (título, autor) fácilmente.
GridFSDBFile outputFile = gfs.findOne(new BasicDBObject("_id", 101));
BasicDBObject updatedMetadata = new BasicDBObject();
updatedMetadata.put("name", "PG");
updatedMetadata.put("age", 22);
outputFile.setMetaData(newMetadata);
outputFile.save();