Sling Academy
Home/MongoDB/MongoDB: How to combine data from 2 collections into one

MongoDB: How to combine data from 2 collections into one

Last updated: February 19, 2024

Introduction

MongoDB, a popular NoSQL database, is known for its flexibility and performance in handling vast amounts of data. Often, developers encounter scenarios where data needs to be combined from two collections into one. This can be for various reasons, such as reporting, data aggregation, or simplifying complex queries. MongoDB provides several ways to achieve this, and in this article, we’ll explore how to combine data from two collections using the aggregation framework and the $lookup operator. We’ll also touch on the use of MongoDB Compass for those who prefer a graphical interface.

Getting Started

The aggregation framework is a powerful feature in MongoDB that allows data processing and aggregation in a pipeline. A pipeline is a series of stages, each transforming the documents in some way. The $lookup operator, introduced in MongoDB 3.2, is particularly useful for combining data from two collections.

Scenario Setup

Let’s consider two collections: orders and customers. The orders collection contains documents with order details, including a customer ID linking to the customers collection, which holds customer information.

{
  "_id": ObjectId("597a3f9c3838410b1c0e2ddd"),
  "orderDate": "2020-07-29",
  "customerId": ObjectId("597a3ebb3838410b1c0e2dac"),
  "item": "Laptop",
  "quantity": 1
}
{
  "_id": ObjectId("597a3ebb3838410b1c0e2dac"),
  "name": "John Doe",
  "address": "123 Main St"
}

Combining Data Using $lookup

To combine data from these two collections, we’ll use the $lookup stage in our aggregation pipeline. Here’s a step-by-step guide:

  1. Start with the orders collection as the basis of your query.
  2. Add a $lookup stage to bring in the customers data based on the customerId.
  3. Process the result to structure it as you wish.
db.orders.aggregate([
  {
    $lookup: {
      from: "customers",
      localField: "customerId",
      foreignField: "_id",
      as: "customerInfo"
    }
  },
  {
    $unwind: "$customerInfo"
  },
  {
    $project: {
      orderDate: 1,
      item: 1,
      quantity: 1,
      "customerInfo.name": 1,
      "customerInfo.address": 1
    }
  }
])

This example uses the $lookup operator to join the orders collection with the customers collection. The $unwind stage is then used to deconstruct the array of joined documents from customerInfo, followed by a $project stage to shape the output.

Optimizing Your Query

While the above method is straightforward, performance can be an issue with large datasets. Here are some optimization tips:

  • Limit the fields returned by the $project stage to only what’s necessary.
  • Use indexes on the join fields (e.g., customerId).
  • Consider the use of $match stage early in the pipeline to filter documents as soon as possible.

Using MongoDB Compass

For those who prefer a graphical interface, MongoDB Compass provides a user-friendly way to build and test aggregation pipelines. It visually represents each stage of the pipeline, making it easier to understand and adjust. Here, you can also use the $lookup stage, in addition to other aggregation operations, with the flexibility of a point-and-click interface.

Conclusion

Combining data from two collections into one is a common requirement in database management and MongoDB provides robust tools to accomplish this with efficiency and flexibility. Whether you code your queries or use a graphical interface like MongoDB Compass, understanding how to effectively use the aggregation framework and the $lookup operator is key to unlocking MongoDB’s potential in data manipulation and analysis.

Keep experimenting with different pipelines and structures to find the best fit for your specific use case. MongoDB’s flexibility allows for a wide range of possibilities, and mastering these techniques can significantly enhance your database management skills.

Next Article: References (Manual Linking) in MongoDB: A Developer’s Guide (with Examples)

Previous Article: MongoDB Upsert: Update if exists, otherwise insert new record

Series: MongoDB Tutorials

MongoDB

You May Also Like

  • Hashed Indexes in MongoDB: A Practical Guide
  • Partitioning and Sharding in MongoDB: A Practical Guide (with Examples)
  • Geospatial Indexes in MongoDB: How to Speed Up Geospatial Queries
  • Understanding Partial Indexes in MongoDB
  • Exploring Sparse Indexes in MongoDB (with Examples)
  • Using Wildcard Indexes in MongoDB: An In-Depth Guide
  • Matching binary values in MongoDB: A practical guide (with examples)
  • Understanding $slice operator in MongoDB (with examples)
  • Caching in MongoDB: A practical guide (with examples)
  • CannotReuseObject Error: Attempted illegal reuse of a Mongo object in the same process space
  • How to perform cascade deletion in MongoDB (with examples)
  • MongoDB: Using $not and $nor operators to negate a query
  • MongoDB: Find SUM/MIN/MAX/AVG of each group in a collection
  • References (Manual Linking) in MongoDB: A Developer’s Guide (with Examples)
  • MongoDB: How to see all fields in a collection (with examples)
  • Type checking in MongoDB: A practical guide (with examples)
  • How to query an array of subdocuments in MongoDB (with examples)
  • MongoDB: How to compare 2 documents (with examples)
  • MongoDB Connection String URI Format: Explained with Examples