sql >> Databasteknik >  >> NoSQL >> MongoDB

Hämta ljud - binär fil - lagrad i min Mlab

Du behöver inte GridFS för filer som är mindre än 16 MB. Du kan antingen lagra binär data direkt i MongoDB med BSONs binära typ eller koda din binära data och lagra den som en sträng. Base64 är ett vanligt kodningsval när binär data lagras som strängar.

När du har hämtat data från databasen kan du skriva den till en fil med fs.writeFile .

Om du sparat dina data som en binär typ kan du skicka en buffert till fs.writeFile . Om du sparat din data som en kodad sträng kan du skicka en sträng och en encoding alternativ.

(Om du vill visa filen med Express kan du ställa in innehållstypen och skicka data med res.send )

Här är ett litet exempel i NodeJS. Detta läser en ljudfil från disken, sparar den i en MongoDB-databas som en binär typ (med MongoDB-drivrutinens Binär class), hämtar den tillbaka från databasen och skriver den till en ny fil på disken.

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()

Även om människor lagrar binär data i databasen, är det förmodligen vanligast att människor lagrar filer i ett filsystem eller i objektlagring (som Amazon S3). Sedan skulle de bara lagra en länk till den filen i databasen och hämta den filen med hjälp av länken. Du kan göra det du känner dig mer bekväm med.




  1. Ta bort ett underdokument kapslat i en array i MongoDB

  2. Vad är motsvarigheten till skalkommandot collection.getIndex() i pymongo?

  3. Vad betyder MongoDB:s dokumentation när den säger att ObjectIDs sannolikt är unika?

  4. Löjligt långsam mongoDB-fråga på liten samling i enkel men stor databas