Sling Academy
Home/Node.js/Mongoose: How to push object to an array in a document

Mongoose: How to push object to an array in a document

Last updated: December 30, 2023

This tutorial explains the steps necessary to push an object to an array within a document using Mongoose, the popular MongoDB object data modeling (ODM) library for Node.js. Throughout this guide, I will be assuming that you have a working knowledge of Node.js, as well as an understanding of MongoDB and Mongoose. If you’re not familiar with Mongoose, it allows us to define schemas for our collections and provides a straightforward way to interact with MongoDB using structured models.

Overview

Arrays within documents are common occurrences in MongoDB databases as they allow you to store multiple values for a single key. The need to add new elements to these arrays arises when new data needs to be associated with a particular document.

Mongoose provides multiple ways to add objects to arrays in a document such as push, $push with $each, positional $ operator for array updates in subdocuments, and Mongoose’s array addToSet method to push only unique objects.

Getting Started

Your starting point would be a Node.js project with Mongoose installed. If you haven’t already, you can install Mongoose with NPM:

npm install mongoose

We will start by defining a schema that includes an array field:

import mongoose from 'mongoose';

const { Schema } = mongoose;

const itemSchema = new Schema({
  name: String,
  items: [{ type: Schema.Types.ObjectId, ref: 'Item' }]
});

const Item = mongoose.model('Item', itemSchema);

Basic Update Using Push

Initially, to push an item to an array, you will define the items you want to intake and employ the findByIdAndUpdate method along with $push:

const newItem = {...}; // Object representing new item specific for your schema

Item.findByIdAndUpdate(
  shopId, // ID of the document to update
  { $push: { items: newItem } },
  { new: true, safe: true, upsert: true },
  (err, shop) => {
    if (err) return handleError(err);
    console.log('The object was successfully added.');
  }
);

Using this approach, every call to findByIdAndUpdate will find therelevant document and add the specified item to the items array.

Pushing Arrays of Objects

If you want to push an array of objects instead of one by one, Mongoose provides the $each operator for this purpose:

const newItems = [...]; // An array of new objects
teh same as above except the change to your elements.

Using the $addToSet Operator

If you’re looking.. trying to maintain a set of unique items. If an object or value is already found in the array, it will not be added a second time:

Item.findByIdAndUpdate(
  shopId,
  { $addToSet: { items: { $each: newItems } } },
  { new: true, safe: true},
  (err, shop) => {
    ...
  }
);

Updating Nested Objects in Arrays

When update or push, you would typically use dot notation partnered with the positional $ operator:

Item.findOneAndUpdate(
  { _id: shopId, 'items._id': itemId },
  { $set: { 'items.$.property': newValue } },
  { new: true },
  (err, result) => ...
);

Conclusions

While Mongoose provides some abstraction over bare MongoDB queries,
benefits both organizations and developer’s productivity as it makes data management structured and clean. Utilizing proper Mongoose techniques to push objects into arrays could leverage and aid in building solid and performance optimized queries.

It’s paramount to select the most efficient method:the $push that suits the situation at hand. Every application has different needs, varying data patterns
Better mastering of Mongoose will definitely be an edge in your datab-ase handling strategy。</p >

Next Article: Using Regular Expressions in Mongoose Queries

Previous Article: Mongoose: How to set expire TTL for a document

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