$push in MongoDb not working?

2020-04-11 07:16发布

问题:

my schema looks like this:

    var exampleSchema = newSchema({
    profile:{
    experience :[{
              exp : String
    }]
   }
  }); 

this is the codes to update experience in profile collection:

exampleSchema.statics.experience = function (id,experience, callback){
var update = {
        $push: {
          'profile.experience': experience
        }
      }
      this.findByIdAndUpdate(id,update,function(err) {
        if (err) {
          callback(err);
        } else {
          callback(null);
        }
      })

I was getting error like The field 'profile.experience' must be an array but is of type String in document {_id: ObjectId('5653f1d852cf7b4c0bfeb54a')}[object Object]

console.log(experience) is equal to

{ exp: 'jlkjlkjlk' }

my collection should look like this:

experience:[
   {
    exp : "YYYY"
    },
   {
    exp:"xxxx"}
 ]

回答1:

Imagine that you have this collection:

/* 1 */
{
    "_id" : ObjectId("565425e862760dfe14339ba8"),
    "profile" : {
        "experience" : [ 
            {
                "exp" : "Experto"
            }
        ]
    }
}

/* 2 */
{
    "_id" : ObjectId("565425f562760dfe14339ba9"),
    "profile" : {
        "experience" : {
            "exp" : "Experto"
        }
    }
}

/* 3 */
{
    "_id" : ObjectId("5654260662760dfe14339baa"),
    "profile" : {
        "experience" : "Experto"
    }
}

If you try (update doc /* 2 */):

db.profile.update(
   { _id: ObjectId("565425f562760dfe14339ba9") },
   { $push: { "profile.experience" : { exp : "Intermediate" } } }
)

You get this error:

The field 'profile.experience' must be an array but is of type Object in document {_id: ObjectId('565425f562760dfe14339ba9')}

And if you try (update doc /* 3 */):

db.profile.update(
   { _id: ObjectId("5654260662760dfe14339baa") },
   { $push: { "profile.experience" : { exp : "Intermediate" } } }
)

You will get:

The field 'profile.experience' must be an array but is of type String in document {_id: ObjectId('5654260662760dfe14339baa')}



回答2:

i changed Schema like this

 experience          : [{type:String,exp:String}],

my update object looks like this

 var update = {
    $push: {
      'profile.experience': san.exp
}
};

san looks like this :{ exp: 'YYY' }

Inside mongoose collectionlooks like this used RoboMongo

 "experience" : [ 
        "experienced in XXX", 
        "YYY"
    ],


回答3:

$push: {
    'profile.experience': experience
}

Remove .exp.



回答4:

are you searching for adding multiple values into single field then use this one. write this one your model or schema:

    arrayremarks:[{remark: String}]

then write in your controller:

module.exports.addingremarks = (req, res) => {
    let casenum=JSON.parse(JSON.stringify(req.body.casenum).replace(/"\s+|\s+"/g,'"'))
    var rem={remark:"Suman macha"}
    Inwart.update( { 'casenum': casenum },{ $push: { arrayremarks:rem} } ,function (err, inwarts) {
        if (err)
         return console.error(err); 
         res.send(inwarts);  
     }
  )
}