sql >> Database teknologi >  >> NoSQL >> MongoDB

Hent lyd - binær fil - gemt i mit Mlab

Du behøver ikke GridFS for filer mindre end 16 MB. Du kan enten gemme binære data direkte i MongoDB ved hjælp af BSONs binære type eller indkode dine binære data og gem dem som en streng. Base64 er et almindeligt kodningsvalg ved lagring af binære data som strenge.

Når du har hentet dataene fra databasen, kan du skrive dem til en fil ved hjælp af fs.writeFile .

Hvis du har gemt dine data som en binær type, kan du sende en buffer til fs.writeFile . Hvis du har gemt dine data som en kodet streng, kan du sende en streng og en encoding mulighed.

(Hvis du vil servere filen med Express, kan du indstille indholdstypen og sende dataene ved hjælp af res.send )

Her er et lille eksempel i NodeJS. Dette læser en lydfil fra disken, gemmer den i en MongoDB-database som en binær type (ved hjælp af MongoDB-driverens Binær klasse), henter den tilbage fra databasen og skriver den til 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()

Selvom folk gemmer binære data i databasen, er det nok mest almindeligt, at folk gemmer filer i et filsystem eller i objektlager (såsom Amazon S3). Så ville de bare gemme et link til den fil i databasen og hente den fil ved hjælp af linket. Du kan gøre, hvad du føler dig bedst tilpas med.




  1. mongodb-forespørgsel:hvordan får man unikke poster

  2. Sådan får du en række json-objekter i stedet for mongoose-dokumenter

  3. embedmongo med reactivemongo-processen afsluttes ikke

  4. Hvordan adskiller redis instansen med flere brugere, der kører på samme server?