sql >> Base de Datos >  >> NoSQL >> MongoDB

Almacenamiento de archivos en MongoDB con GridFS

Muchas aplicaciones involucran la administración de archivos y tienen el almacenamiento de archivos como una función importante para mejorar el procesamiento de datos. El almacenamiento de archivos a menudo requiere una CDN (red de entrega de contenido) de terceros, como los servicios web de Amazon, pero esto hace que el proceso de administración sea un poco tedioso. Sería más fácil acceder a todos sus recursos desde un solo almacenamiento en la nube, en lugar de múltiples, ya que puede haber una posibilidad de falla durante la recuperación.

Almacenar archivos directamente en una base de datos a través de una sola llamada API no ha sido algo fácil de hacer hasta la introducción de GridFS en MongoDB.

¿Qué es MongoDB GridFS?

GridFs es una capa de abstracción en MongoDB utilizada en el almacenamiento y la recuperación de archivos grandes como videos, audios e imágenes. Este sistema de archivos almacena archivos que son incluso más importantes que 16 MB dentro de las colecciones de datos de MongoDB. Los archivos se almacenan dividiéndolos primero en fragmentos de datos más pequeños, cada uno de los cuales tiene un tamaño de 255 KB.

GridFS utiliza dos sistemas de recopilación para almacenar archivos:

  1. Pieza :Esta es la colección que almacena las partes del documento. Los fragmentos están limitados a un tamaño de 255 KB cada uno y cuando uno realiza una consulta, el controlador GridFS vuelve a ensamblar todos los fragmentos según el _id único de almacenamiento. Por ejemplo, podría querer recuperar un segmento de un archivo de video en lugar de todo el archivo, esto es posible simplemente consultando el rango correcto que desea.
  2. Archivo :Esto almacena los consiguientes metadatos adicionales para el archivo.

Las colecciones se colocan en un contenedor común y luego se anteponen a cada una con el nombre del contenedor, que por defecto es fs, por lo que tenemos:

  • fs.trozos
  • fs.archivos

Se puede elegir un nombre de depósito diferente, pero el nombre completo de la colección está sujeto a:límite de espacio de nombres de 255 bytes.

Colección de trozos

Los documentos de colección de fragmentos tienen el formato: 

{

  "_id" : <ObjectId>,

  "files_id" : <ObjectId>,

  "n" : <num>,

  "data" : <binary>

}

Dónde:

  • _id:es el identificador único del fragmento
  • files_id:es el _id del documento principal almacenado en la colección de archivos
  • n:es el número de secuencia del fragmento que comienza con 0.
  • datos:es la carga útil del fragmento como tipo binario BSON.

Se usa un índice compuesto que usa los campos id_archivos y n para permitir la recuperación eficiente de fragmentos, por ejemplo:

db.fs.chunks.find( { files_id: fileId } ).sort( { n: 1 } )

Para crear este índice si no existe, puede ejecutar el siguiente comando en un shell mongo:

db.fs.chunks.createIndex( { files_id: 1, n: 1 }, { unique: true } );

Colección de archivos

Los documentos en esta colección toman la forma

{

  "_id" : <ObjectId>,

  "length" : <num>,

  "chunkSize" : <num>,

  "uploadDate" : <timestamp>,

  "filename" : <string>,

  "metadata" : <any>,

}

Dónde:

  •  _id:es el identificador único del documento que es del tipo de datos que se elige para el documento original y, de forma predeterminada en MongoDB, es el ObjectId de BSON.
  • longitud:es el tamaño del documento en bytes
  • chunkSize:tamaño de cada fragmento que está limitado a 255 kilobytes
  • uploadDate:campo de tipo Fecha que almacena la fecha en que se almacenó el documento por primera vez.
  • nombre de archivo:este es un campo opcional que es una identificación legible por humanos para el archivo.
  • metadatos:este es un campo opcional que contiene información adicional que uno desea almacenar.

A continuación se muestra un ejemplo de un archivo fs.

{

   "filename": "file.html",

   "chunkSize": NumberInt(23980),

   "uploadDate": ISODate("2020-08-11T10:02:15.237Z"),

   "length": NumberInt(312)

}

Al igual que la colección de fragmentos, en la colección de archivos se utiliza un índice compuesto que utiliza los campos nombre de archivo y fecha de carga para permitir la recuperación eficiente de archivos, por ejemplo:

db.fs.files.find( { filename: fileName } ).sort( { uploadDate: 1 } )

Para crear este índice si no existe, puede ejecutar el siguiente comando en un shell mongo:

db.fs.file.createIndex( { filename: 1, uploadDate: 1 }, { unique: true } );

Cuándo usar el sistema de almacenamiento MongoDB GridFS

MongoDB GridFS no se usa comúnmente, pero las siguientes son las condiciones que pueden requerir el uso de este sistema de almacenamiento GridFS;

  •  Cuando el sistema de archivos actual tiene un límite en la cantidad de archivos que se pueden almacenar en un directorio determinado.
  •  Cuando se pretende acceder a parte de la información almacenada, GridFS permite recuperar partes del archivo sin acceder a todo el documento.
  • Cuando uno tiene la intención de distribuir archivos y sus metadatos a través de conjuntos de réplicas distribuidas geográficamente, GridFS permite que los metadatos se sincronicen e implementen los datos en varios sistemas de destino automáticamente.

Cuándo no usar el sistema de almacenamiento MongoDB GridFS

Sin embargo, el sistema de almacenamiento GridFS no es apropiado para usar cuando sea necesario actualizar el contenido de todo el archivo guardado en GridFS.

Cómo agregar archivos a GridFS

Al almacenar un archivo mp3 en MongoDB usando GridFs, el procedimiento correcto a seguir es este;

  1. Abra la terminal (El símbolo del sistema)
  2. Navegue a mongofiles.exe (se encuentra en la carpeta bin)
  3. Use el comando 
    >mongofiles.exe -d gridfs put song.mp3

Después del comando, el nombre de la base de datos que se utilizará es gridfs, si por casualidad falta el nombre, MongoDB crea automáticamente un documento que almacena el archivo en la base de datos.

Para ver el archivo almacenado en GridFS, use el siguiente comando de consulta en el shell de mongo;

>db.fs.files.find()

El comando devuelve un documento con el formato que se muestra a continuación:

{

   _id: ObjectId('526a922bf8b4aa4d33fdf84d'),

   filename: "song.mp3",

   chunkSize: 233390,

   uploadDate: new Date(1397391643474), md5: "e4f53379c909f7bed2e9d631e15c1c41",

   length: 10302960

}

El archivo tiene los siguientes detalles:nombre de archivo, longitud, fecha de carga, tamaño de fragmento y object_id. Los fragmentos en la colección fs.chunks se pueden ver usando la identificación devuelta en la consulta inicial como se muestra a continuación.

>db.fs.chunks.find({files_id:ObjectId('526a922bf8b4aa4d33fdf84d')})

Fragmentación GridFS

La fragmentación también es otra característica aplicable con GridFS. Para fragmentar la colección de fragmentos, se puede usar un índice compuesto de {files_id:1, n:1} o {files_id:1} como clave de fragmento.

La fragmentación fragmentada solo es posible si los controladores MongoDB no ejecutan filemd5.

Las colecciones de archivos a menudo no se fragmentan porque solo contienen metadatos y son muy pequeñas. Las claves disponibles tampoco proporcionan una distribución uniforme en un clúster fragmentado. Sin embargo, si necesita fragmentar una colección de archivos, puede usar el campo _id en combinación con algunos campos de la aplicación.

Limitaciones de GridFS

El sistema de archivos GridFS tiene las siguientes limitaciones:

  1. Actualización atómica: GridFS no tiene una actualización atómica. Esto facilita la actualización manual seleccionando la versión requerida de los archivos y manteniendo varias versiones de los archivos en ejecución
  2. Rendimiento :  el sistema tiende a ser lento con el sistema de archivos y el servidor web.
  3. Conjunto de trabajo: uno usa otro servidor cuando trabaja en un nuevo conjunto de trabajo. Esto se hace para evitar perturbar el conjunto de trabajo en ejecución.

Conclusión

GridFS es como una bala de plata para los desarrolladores que tienen la intención de almacenar archivos de gran tamaño en MongoDB. El sistema de almacenamiento GridFS brinda a los desarrolladores la oportunidad de almacenar archivos grandes y recuperar partes de los archivos necesarios. GridFS es, por lo tanto, una excelente característica de MongoDB que se puede usar con varias aplicaciones.