Sling Academy
Home/Node.js/Mongoose: How to Access a Pre-Existing Collection

Mongoose: How to Access a Pre-Existing Collection

Last updated: December 30, 2023

Overview

Mongoose is a MongoDB object modeling tool designed to work in an asynchronous environment. It provides a straightforward, schema-based solution to model your application’s data. In this article, we will go through the necessary steps to access and interact with a preexisting collection in a MongoDB database using Mongoose. We’ll cover everything from setting up your Mongoose connection to performing queries on your existing data.

Setting up Mongoose

Before accessing a collection, we need to set up Mongoose. Installing Mongoose is a straightforward process using npm:

npm install mongoose

Once installed, setup a connection to your MongoDB database:

const mongoose = require('mongoose');

mongoose.connect('mongodb://localhost:27017/mydatabase', {
  useNewUrlParser: true,
  useUnifiedTopology: true
});

Accessing the Collection

If you are working with a collection that already exists, the first step is to define the schema that matches the documents in the collection:

const Schema = mongoose.Schema;
const myExistingSchema = new Schema({}, { strict: false });

Here we used an empty schema and set strict mode to false to allow the schema to adapt to all possible fields within your documents.

Once the schema is ready, you would create a model that connects to the existing collection:

const MyExistingModel = mongoose.model('MyExisting', myExistingSchema, 'myExistingCollection');

Performing Queries

Now that your model is connected to the existing collection, you can perform operations like find, insert, update, or delete. Here’s how to find all documents:

MyExistingModel.find({}).then(docs => {
  console.log(docs);
}).catch(err => {
  console.error(err);
});

Interacting with Data

Adding new documents is as simple as calling the save method on a new instance of your model:

const newDoc = new MyExistingModel({ name: 'NewDoc', value: 'newValue' });
newDoc.save()
  .then(doc => {
    console.log('Document saved:', doc);
  })
  .catch(err => {
    console.error('Error saving document:', err);
  });

Schema validation and Custom Queries

It is possible to enforce schema validation on existing collections by defining rules within the schema definitions. Here’s a way to add some dummy validation:

const myValidatedSchema = new Schema({
  name: { type: String, required: true },
  value: { type: String, required: false }
});

We might also want to create more complex custom queries or use additional features such as population and aggregation:

MyExistingModel.find({ name: 'Example' }).populate('otherCollectionRef').exec()
.then(docs => {
  console.log('Populated Docs:', docs);
})
.catch(err => {
  console.error(err);
});

Migrating Data

In some cases, you might need to migrate data to a new schema. Here’s how you could copy documents from one collection to another:

MyOldModel.find({})
.exec()
.then(docs => {
  const migrationPromises = docs.map(doc => {
    const newDoc = new MyNewModel(doc);
    return newDoc.save();
  });
  return Promise.all(migrationPromises);
})
.then(() => console.log('Migration completed.'))
.catch(err => console.error('Migrations failed:', err));

For advanced usage, you could leverage Mongoose plugins, transaction support, or other features such as discriminators, which allow you to have multiple models within the same collection structure.

Final Words

Accessing and manipulating preexisting MongoDB collections using Mongoose is not only possible but streamlined and powerful once properly understood and implemented. With adherence to best practices and a careful understanding of schema validation, Mongoose can serve as an excellent bridge between your Node.js application and your data stored in MongoDB.

Next Article: How to query distinct values in Mongoose

Previous Article: Fix MongooseServerSelectionError: connect ECONNREFUSED

Series: Mongoose.js Tutorials

Node.js

You May Also Like

  • NestJS: How to create cursor-based pagination (2 examples)
  • Cursor-Based Pagination in SequelizeJS: Practical Examples
  • MongooseJS: Cursor-Based Pagination Examples
  • Node.js: How to get location from IP address (3 approaches)
  • SequelizeJS: How to reset auto-increment ID after deleting records
  • SequelizeJS: Grouping Results by Multiple Columns
  • NestJS: Using Faker.js to populate database (for testing)
  • NodeJS: Search and download images by keyword from Unsplash API
  • NestJS: Generate N random users using Faker.js
  • Sequelize Upsert: How to insert or update a record in one query
  • NodeJS: Declaring types when using dotenv with TypeScript
  • Using ExpressJS and Multer with TypeScript
  • NodeJS: Link to static assets (JS, CSS) in Pug templates
  • NodeJS: How to use mixins in Pug templates
  • NodeJS: Displaying images and links in Pug templates
  • ExpressJS + Pug: How to use loops to render array data
  • ExpressJS: Using MORGAN to Log HTTP Requests
  • NodeJS: Using express-fileupload to simply upload files
  • ExpressJS: How to render JSON in Pug templates