Search code examples
javascriptmongodbmongoosenosqlmongoose-schema

MongoDB connect model with a specific database


When I use mongoose.connection, models are connected directly with the unique connection.

In this case db1 is only used for querying (not model require). But db2 use 2 models.

How can I connect those models with db2 only?

Thanks for helping

const db1 = mongoose.createConnection("atlasuri").asPromise()
const db2 = mongoose.createConnection("localuri").asPromise()

app.get("/",async(req,res)=>{
    const finded =  (await db1).collection("users")
    await finded.forEach(el=> console.log(el))
    res.json(finded)
})

Models

const Criterion1=new mongoose.model('Criterion',new mongoose.Schema({
 name:string
}));
const User=new mongoose.model('Criterion',new mongoose.Schema({
 name:string
}));

Solution

  • Use createConnection():

    const CriterionModel = require('./criterion');
    const mongoose = require('mongoose');
    
    const atlasuri = 'mongodb://localhost:27017/so1';  // <== your Atlas URI HERE
    const localuri = 'mongodb://localhost:27017/so2';
    
    const conn = mongoose.createConnection(atlasuri);
    const conn2 = mongoose.createConnection(localuri);
    
    const Criterion1 = conn.model('Criterion', new mongoose.Schema({
      name:String
    }));
    
    const users = conn2.model('Criterion', new mongoose.Schema({
      name:String
    }));
    
    // atlasuri
    conn.on('connected', async () => {
      const doc = await Criterion1({  // add a document
        'name': 'Only in atlasuri'
      });
        
      await doc.save((err, doc) => {
        if (err) {
          console.log('error adding!');
        }
      });
    
      console.log('Added to atlas');
    });
    
    // localuri
    conn2.on('connected', async () => {
      // add a document
      const doc = await users({  // add a document
        'name': 'Only in localuri'
      });
       
      doc.save((err, doc) => {
        if (err) {
          console.log('error adding!');
        }
      });
      console.log('Added to local');
    });
    
    function handleExit(signal) {
      console.log(`Received ${signal}. Shutting down.`);
      conn.close();
      conn2.close();
      process.exit(0);
    }
    process.on('SIGINT', handleExit);
    process.on('SIGQUIT', handleExit);
    process.on('SIGTERM', handleExit);
    

    In criterion.js:

    const mongoose = require('mongoose');
    
    const CriterionSchema = mongoose.Schema({
      name:String
    });
    
    module.exports = mongoose.model('Criterion', CriterionSchema);