Understanding MongoDB Schema: Schema-less Approach, Direct Schema Creation, and the Role of ODMs

ABASIODIONG UDOFIA
5 min readMay 31, 2023

--

Schema-less nature of mongodb code snippet

Table of Contents:

1. Introduction
2. Understanding Schema-less Approach
— Sample Code: Storing Data Without a Predefined Schema
3. Creating a Schema Directly in MongoDB without ODM
— Sample Code: The Schema approach in MongodBD without ODM
4. Leveraging Schema with ODM (Using Mongoose)
— Sample Code: Creating a Schema with Mongoose
5. Comparing the Approaches
— Benefits of Going Schema-less
— Benefits of MongoDB Schema without ODM
— Benefits of ODM
— Downsides of Each Approach
6. Conclusion
7. References

Introduction

MongoDB is a document-oriented database that allows for flexible data storage. Unlike traditional relational databases, MongoDB does not enforce a rigid schema for your data, giving you the freedom to evolve your data structure over time. However, you can also choose to define a schema using an ODM like Mongoose, which provides a higher level of structure and validation.

Understanding Schema-less Approach

In the schema-less approach, you can store documents in MongoDB without a predefined schema. Each document can have its own set of fields and data types..[Schema Design]. Let’s take a look at a sample code snippet that demonstrates storing data without a schema:

const { MongoClient } = require('mongodb');

async function insertDocument() {
const uri = 'mongodb://localhost:27017';
const client = new MongoClient(uri);

try {
await client.connect();

const database = client.db('mydb');
const collection = database.collection('users');

// Create a document without a predefined schema
const user = {
name: 'John Doe',
age: 30,
email: 'john@example.com'
};

// Insert the document into the collection
const result = await collection.insertOne(user);
console.log(`Document inserted with _id: ${result.insertedId}`);
} finally {
await client.close();
}
}

In this example, we connect to MongoDB and insert a document directly into a collection without defining a schema beforehand. The document (`user`) consists of fields such as `name`, `age`, and `email`. MongoDB allows for flexible document structures within a collection, giving you the freedom to store data as needed.

Creating a Schema Directly in MongoDB without ODM

Although MongoDB is schema-less by nature, you can still define and enforce a schema directly in MongoDB without relying on an ODM. This approach involves using MongoDB’s validation and indexing capabilities to ensure data consistency and enforce schema rules at the database level..[Schema Validation]. By creating validators and associating them with collections, you can define field requirements, data types, and validation rules.

const { MongoClient } = require('mongodb');

async function createSchema() {
const uri = 'mongodb://localhost:27017';
const client = new MongoClient(uri);

try {
await client.connect();

const database = client.db('mydb');
const collection = database.collection('users');

// Define the schema
const schema = {
name: {
$type: 'string',
$required: true
},
age: {
$type: 'int',
$required: true
},
email: {
$type: 'string',
$required: true,
$unique: true
}
};

// Create a validator to enforce the schema
const validator = {
$jsonSchema: {
bsonType: 'object',
required: ['name', 'age', 'email'],
properties: {
name: { bsonType: 'string' },
age: { bsonType: 'int' },
email: { bsonType: 'string' }
}
}
};

// Associate the validator with the collection
await collection.createIndex({ name: 1, age: 1, email: 1 }, { unique: true });
await collection.createIndexes([{ key: validator, name: 'validator' }]);
} finally {
await client.close();
}
}

createSchema();

In this example, we create a schema using a JSON object that defines the structure and validation rules for the “users” collection. We enforce the schema by creating a validator and associating it with the collection using the createIndexes method.

Leveraging Schema with ODM (Using Mongoose)

ODMs, such as Mongoose for MongoDB, provide a way to define and enforce schemas at the application level. With an ODM, you can create structured schemas with defined fields, data types, validation rules, and relationships between collections…[elegant MongoDB object modeling for Node.js]. ODMs offer additional features like data manipulation, query building, hooks, and middleware, making it easier to work with MongoDB in a structured manner.

const mongoose = require('mongoose');

// Connect to MongoDB
mongoose.connect('mongodb://localhost/mydb', { useNewUrlParser: true, useUnifiedTopology: true });

// Define the schema
const userSchema = new mongoose.Schema({
name: {
type: String,
required: true
},
age: {
type: Number,
required: true
},
email: {
type: String,
required: true,
unique: true
}
});

// Create a model based on the schema
const User = mongoose.model('User', userSchema);

// Create a new user
const user = new User({
name: 'John Doe',
age: 30,
email: 'john@example.com'
});

// Save the user to the database
user.save()
.then(() => {
console.log('User saved successfully.');
mongoose.disconnect();
})
.catch((error) => {
console.error('Error saving user:', error);
mongoose.disconnect();
});

In this example, we use Mongoose to define a schema with the desired field types and validation rules. We create a model based on the schema, which provides an interface for interacting with the MongoDB collection. We then create a new user object based on the schema and save it to the database using the save() method.

Comparing the Approaches

Both the schema-less and schema with ODM approaches have their own benefits and considerations. Let’s summarize them briefly:

Benefits of Going Schema-less:
— Flexibility to store documents with varying structures.
— Agile data model evolution.
— Simplified development for dynamic data.

Benefits of MongoDB Schema without ODM:
— Flexibility to define schemas directly in MongoDB without relying on an ODM.
— Simplicity and lightweight approach for small to medium-sized projects.
— Direct control over the database interactions.

Benefits of ODM (e.g., Mongoose):
— Validation and constraint enforcement.
— Middleware and hooks for additional functionality.
— Simplified querying and population of related documents.

Downsides of Each Approach:
— Schema-less: Potential variations in document structure require careful handling in querying and application logic.
— MongoDB Schema without ODM: Lack of advanced features provided by ODMs.
— ODM: Additional layer of abstraction, increased complexity, and potential performance overhead.

Conclusion

In conclusion, MongoDB offers the flexibility of a schema-less approach, allowing developers to work with unstructured or evolving data. However, there are scenarios where defining a schema becomes beneficial, either through direct schema creation in MongoDB or with the help of an ODM. Choosing between the schema-less approach, direct schema creation, or utilizing an ODM depends on factors like data structure, application requirements, development workflow, and performance considerations. Understanding the benefits and downsides of each option will help you make an informed decision when working with MongoDB.

References

MongoDB Documentation: [Schema Design] — https://docs.mongodb.com/manual/core/data-modeling-introduction/
Mongoose: [Mongoose — elegant mongodb object modeling for node.js] — https://www.mongodb.com/developer/languages/javascript/getting-started-with-mongodb-and-mongoose
MongoDB Documentation: [Schema Validation] — https://docs.mongodb.com/manual/core/schema-validation

--

--

ABASIODIONG UDOFIA

Backend Engineer | NodeJS fan | Mentor @GADs | enthusiastic learner of the world of tech