How to filter with Mongo and Node ? using GridFs

Viewed 17

I am making an Api with Node and Mongo that receives large volumes of data, I was receiving an error because the size of the records that were stored in mongo exceeded 16 MB. So I opted for the alternative offered by mongo in its gridFS documentation, to insert the records, which I had no problems with. But I am having conflicts to insert and filter since I don't know how to do it, I read the documentation and there are several ways. But I can't figure out how to filter (find a record by its field) and how to update.

The function to create a record works but it performs some necessary steps such as storing the json it receives in a file and then reading it and with that creating the record, I would have liked to find a more practical solution such as only inserting the json it receives without having to create a file with its content and then get the information from that file I attach the code to see if you can tell me how to solve this problem:

const { MongoClient, ObjectId, GridFSBucket,} = require('mongodb');
const { config } = require('../../config');
//const USER = encodeURIComponent(config.noRelDbUser);
//const PASSWORD = encodeURIComponent(config.noRelDbPassword);
const DB_NAME = config.noRelDbName;
const fs = require('fs');
const removeFile = require('../../modules/results/utils/RemoveFile');
// const MONGO_URI = `mongodb://${USER}:${PASSWORD}@${config.dbHost}:${config.dbPort}/admin?retryWrites=true&w=majority`
const MONGO_URI = `mongodb://${config.noRelDbHost}:${config.noRelDbPort}`;

class MongoLib {
    constructor() {
        this.client = new MongoClient(MONGO_URI, { useNewUrlParser: true, useUnifiedTopology: true });
        this.dbName = DB_NAME;
    }

    connect() {
        if (!MongoLib.connection) {
            MongoLib.connection = new Promise((resolve, reject) => {
                this.client.connect((err) => {
                    if (err) {
                        reject(err);
                    }

                    resolve(this.client.db(this.dbName));
                });
            });
        }

        return MongoLib.connection;
    }
  
    create(collection, data) {
        return this.connect()
            .then((db) => {
                return db.collection(collection).insertOne(data);
            })
            .then((result) => result.insertedId);
    }

     async createWithForBigData(collection, data, vr_id , remove=false){ 
    let vrule_id = vr_id;
     return this.connect().then((db)=>{
     try{
     var bucket = new GridFSBucket(db, {
     bucketName: collection,
     chunkSizeBytes: 260000 ,
    });
     bucket
    bucket.find()
     let uploadStream =  fs.createReadStream(data).pipe(bucket.openUploadStream(`resultsdetail${vrule_id}`));
     let id = uploadStream.id;
     uploadStream.on('error', (err) => {
     console.log({ message: "Error uploading file"  });
     throw new Error(err);
    });

  bucket.find()
      uploadStream.on('finish', () => {  
      console.log({ message: "File uploaded successfully, stored under Mongo ObjectID: " + id });
      if(remove === true){
        console.log('remueve archivo archivo de directorio storebigdata');
        removeFile(data);
      }
      return id;
    });

    }catch(err){
    console.log('ocurrió un error al almacenar big data',err);
    throw new Error(err);
   
    }
     })
    }

    findBigData(){
     //
          
    }
    UpdateBigData(){

   //

    }

   
}

module.exports = MongoLib;


0 Answers
Related