MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Récupérer l'audio - fichier binaire - stocké dans mon Mlab

Vous n'avez pas besoin de GridFS pour les fichiers inférieurs à 16 Mo. Vous pouvez soit stocker des données binaires directement dans MongoDB en utilisant le type binaire de BSON ou encodez vos données binaires et stockez-les sous forme de chaîne. Base64 est un choix d'encodage courant lors du stockage de données binaires sous forme de chaînes.

Une fois que vous avez récupéré les données de la base de données, vous pouvez les écrire dans un fichier en utilisant fs.writeFile .

Si vous avez enregistré vos données sous un type binaire, vous pouvez passer un tampon vers fs.writeFile . Si vous avez enregistré vos données sous forme de chaîne encodée, vous pouvez passer une chaîne et un encoding option.

(Si vous souhaitez servir le fichier avec Express, vous pouvez définir le type de contenu et envoyer les données en utilisant res.send )

Voici un petit exemple dans NodeJS. Cela lit un fichier audio à partir du disque, l'enregistre dans une base de données MongoDB en tant que type binaire (en utilisant Binaire class), le récupère de la base de données et l'écrit dans un nouveau fichier sur le disque.

const mongodb = require('mongodb')
const util = require('util')
const fs = require('fs')
const readFile = util.promisify(fs.readFile)
const writeFile = util.promisify(fs.writeFile)

async function main() {
  const client = await mongodb.MongoClient.connect(process.env.MONGO_URI)
  console.log('connected')

  let db = await client.db('dbname')

  // Reading in binary data from a file. data is a buffer.
  let data = await readFile(__dirname + '/sample.mp3')

  // Insert binary data to the database
  let res = await db.collection('coll').insert({data: new mongodb.Binary(data)})
  console.log(res)
  let objectId = res.ops[0]._id

  // Retrieve binary data from the database
  let obj = await db.collection('coll').findOne({_id: objectId})
  console.log(obj)

  // *** This is the key part ***
  // use obj.data.read to get a buffer from the binary data and write that buffer to a file
  await writeFile(__dirname + '/out.mp3', obj.data.read(0, obj.data.length()))

  console.log('done')
}

main()

Bien que les gens stockent des données binaires dans la base de données, il est probablement plus courant que les gens stockent des fichiers dans un système de fichiers ou dans un stockage d'objets (comme Amazon S3). Ensuite, ils stockeraient simplement un lien vers ce fichier dans la base de données et récupéreraient ce fichier à l'aide du lien. Vous pouvez faire ce avec quoi vous vous sentez le plus à l'aise.