21

I want to update a array value but i am not sure about the proper method to do it ,so for i tried following method but didnt worked for me.

My model, The children field in my model

   childrens: {
       type: Array,
       default: ''
  }

My query,

   Employeehierarchy.update({ _id: employeeparent._id} ,{ $set: {"$push": { "childrens": employee._id }} })
   .exec(function (err, managerparent) {});

Can anyone please provide me help.Thanks.

MMR
  • 2,869
  • 13
  • 56
  • 110

3 Answers3

38

You can't use both $set and $push in the same update expression as nested operators.

The correct syntax for using the update operators follows:

{
   <operator1>: { <field1>: <value1>, ... },
   <operator2>: { <field2>: <value2>, ... },
   ...
}

where <operator1>, <operator2> can be from any of the update operators list specified here.

For adding a new element to the array, a single $push operator will suffice e.g. you can use the findByIdAndUpdate update method to return the modified document as

Employeehierarchy.findByIdAndUpdate(employeeparent._id,
    { "$push": { "childrens": employee._id } },
    { "new": true, "upsert": true },
    function (err, managerparent) {
        if (err) throw err;
        console.log(managerparent);
    }
);

Using your original update() method, the syntax is

Employeehierarchy.update(
   { "_id": employeeparent._id},
   { "$push": { "childrens": employee._id } },
   function (err, raw) {
       if (err) return handleError(err);
       console.log('The raw response from Mongo was ', raw);
   }
);

in which the callback function receives the arguments (err, raw) where

  • err is the error if any occurred
  • raw is the full response from Mongo

Since you want to check the modified document, I'd suggest you use the findByIdAndUpdate function since the update() method won't give you the modified document, just the full write result from mongo.


If you want to update a field in the document and add an element to an array at the same time then you can do

Employeehierarchy.findByIdAndUpdate(employeeparent._id,
    { 
        "$set": { "name": "foo" },
        "$push": { "childrens": employee._id } 
    } 
    { "new": true, "upsert": true },
    function (err, managerparent) {
        if (err) throw err;
        console.log(managerparent);
    }
);

The above will update the name field to "foo" and add the employee id to the childrens array.

chridam
  • 100,957
  • 23
  • 236
  • 235
  • If i test for manager print console.log(managerparent+'kk') i am getting error as uncaughtException: managerparent is not defined – MMR Jan 06 '17 at 09:14
  • Thsnks chridam it wrkd. – MMR Jan 06 '17 at 10:08
  • still i have one more question for you :),if you are OK. – MMR Jan 06 '17 at 10:09
  • Hi chridam,http://stackoverflow.com/questions/41506447/how-to-update-records-on-continues-hierarchy-in-momgoose – MMR Jan 06 '17 at 13:08
3

can follow this

if childrens contains string values then model can be like:

childrens: [{
    type : String
}]

if childrens contains ObjectId values of another collection _id and want populate then model can be like:

childrens: [{
    type : mongoose.Schema.Types.ObjectId,
    ref: 'refModelName'
}]

no need to use $set just use $push to insert value in childrens array. so query can be like:

Employeehierarchy.update(
   { _id: employeeparent._id},
   {"$push": { "childrens": employee._id } }
 ).exec(function (err, managerparent) {
    //
 });
Shaishab Roy
  • 16,335
  • 7
  • 50
  • 68
  • I model is declared so it may become as array of objects?Which i dont want – MMR Jan 06 '17 at 09:21
  • not array of object will be array that will contains ids (as string for first process and for second process as a ObjectId) @nlr_p – Shaishab Roy Jan 06 '17 at 09:30
3

This will help I guess

Employeehierarchy.findOneAndUpdate(
  { _id:employeeparent._id },
  { $set: { "childrens": employee._id }}
)
Deeksha Sharma
  • 3,199
  • 1
  • 19
  • 16