0

I am creating a blog website where you can create your own blog and update it at anytime. However, I want to add a log-in system so that users can have their own separate blog page. My problem is that I have yet to find a way to use both the login database and the blog database in my website. Right now I am using mongoose to connect to mongodb atlas, is there a way to use something like mongoose.connect for multiple databases?

Omki
  • 1
  • You may want to check this post first, there is some examples/hints to solve your problem. https://stackoverflow.com/q/19474712/6188297 – Simon_B Apr 02 '21 at 07:03

2 Answers2

0

You just have two different mongoose schemas, one for the blogs and the other for the log in. They will be separated in the database, you don't need to have two separate ones.

0

Here is an example using mongodb package.
I believe you can use the same logic with Mongoose.

import { Db, MongoClient, MongoError } from "mongodb";

const mongoURIs: MongoDBsInterface = {
  global: {
    uri: process.env.MONGODB_URI_DEFAULT,
    db: process.env.MONGODB_DB_NAME,
  },
  secondary: {
    uri: process.env.MONGODB_URI_DEFAULT,
    db: "secondaryDatabaseInTheSameCluster",
  },
  secondary: {
    uri: "secondClusterURI",
    db: "anotherDatabase",
  },
};


// Connection parameters
const param = {
  numberOfRetries: 20,
  auto_reconnect: true,
  useNewUrlParser: true,
  useUnifiedTopology: true,
};


// Function to start multiple databases
export const startDatabases = (): Promise<MongoDBsDetailInterface> => {
  return new Promise((resolve) => {
    const promises = [];
    logger.info("### Connect to MongoDBs");
    // Loop into each mongoURIs
    for (const lang in mongoURIs) {
      if (mongoURIs[lang]) {
        promises.push(connectToOneDB(lang, mongoURIs[lang]));
      }
    }

    Promise.all(promises).then((res: MongoDBDetailInterface[]) => {
      const dbs: MongoDBsDetailInterface = {};
      // tslint:disable-next-line: prefer-for-of
      for (let i: number = 0; i < res.length; i++) {
        dbs[res[i].lang] = res[i].db;
      }
      resolve(dbs);
    });
  });
};

export const connectToOneDB = (
  lang: string,
  dbValue: MongoDBInterface
): Promise<MongoDBDetailInterface> => {
  return new Promise(async (resolve) => {
    logger.info(` - Connect to ${lang} in db ${dbValue.db} (${dbValue.uri})`);

    // Connect to the db
    const client = new MongoClient(dbValue.uri, param);
    let db = null;
    try {
      await client.connect();
      db = await client.db(dbValue.db);
    } catch (e) {
      logger.error(e.message);
      client.close();
      // you should change that to handle it for your usage
      process.exit(1);
    }
    logger.info(` - Connected to ${lang}`);

    return resolve({ lang, db });
  });
};

And then you can use

const dbs = await startDatabases();

And put it in your global context. You then just need to select the collection you want

dbs.global.collection("...")
callmemath
  • 8,185
  • 4
  • 37
  • 50