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

Updated: December 30, 2023 By: Guest Contributor Post a comment

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 >