Push element to array in mongoose

13,439

Solution 1

As far as I know, you have to do as below.

Model.findAndUpdate({_id: 'your_id'}, 
                    {$push: {'your_array_field': 
                    {"name": "foo","idAccount": 123456}}}, 
                    {new: true}, (err, result) => {
                    // Rest of the action goes here
                   })

Solution 2

We are doing it this way - we are adding another model but in your case your just adding an array so put that in a variable and in place of req.body.resource ..

Also you can just use findByIdAndUpdate not the Async if you don't want to.

here is the model element:

 resources: [{type: mongoose.Schema.Types.ObjectId, ref: 'Resource'}],

here is the method to add an item to the array:

//AddResource to a crew
export function addResource(req, res) {
  if (req.body._id) {
    delete req.body._id;
  }
  Crew.findByIdAndUpdateAsync(req.params.id,
    {
      $push: { "resources": req.body.resource }
    },
    { safe: true, upsert: true },
    function (err, model) {
      if (err) {
        //console.log(err);
        return res.send(err);
      }
      return res.json(model);
    });

and to remove:

//deleteResource to a crew
export function deleteResource(req, res) {
  if (req.body._id) {
    delete req.body._id;
  }
  // console.log(req.body.resource);
  Crew.findByIdAndUpdateAsync(req.params.id,
    {
      $pullAll: { "resources": req.body.resource }
    },
    function (err, model) {
      // console.log(model);
      if (err) {
        //console.log(err);
        return res.send(err);
      }
      return res.json(model);
    });

Solution 3

We can do like that

Model.findOneAndUpdate({"_id":req.body.id},{
            "$push": {"resources": req.body.resources}
        },{new: true, safe: true, upsert: true }).then((result) => {
            return res.status(201).json({
                status: "Success",
                message: "Resources Are Created Successfully",
                data: result
            });
        }).catch((error) => {
            return res.status(500).json({
                status: "Failed",
                message: "Database Error",
                data: error
            });
        });`
Share:
13,439
isanma
Author by

isanma

I am a 22 year old student of Computer Science. Very interested in software development, specially MEAN stack.

Updated on June 05, 2022

Comments

  • isanma
    isanma almost 2 years

    I am trying to push an element to an array in mongoose. I am doing it with update and $push. But it is not updating it in the database. This is my code. routes.js:

        var Chooser = require('../chooser');
    
        var appRouter = function(app) {
    
        app.put("/chooser/:id", function(req, res) {
        console.log("ID: ", req.params.id);
        if (!req.body.toFollow) {
            return res.send({"status": "error", "message": "The account that you want to follow is needed"});
        }
        else {
            console.log("Cuenta: ", req.body.toFollow);
            Chooser.update({_id: req.params.id}, {$push: {accounts: {"name": "foo", "idAccount": 123456}}});
            return res.send({"status": "ok"});
        }
    
      });
    }
    

    This is my mongoose schema. Chooser.js:

    var mongoose = require('mongoose');
    
    var chooserSchema = mongoose.Schema({
    _id: Number,
    accounts: [{name: String, idAccount: Number}]
    }, { _id: false });
    
    var Chooser = mongoose.model('Chooser', chooserSchema);
    
    module.exports = Chooser;