Abdessalem Letaief
Abdessalem Letaief

Reputation: 155

Can't push items in mongo array

I can't push items into MongoDB array every time that i try to push a new element it creates an empty object and i cant figure out why, I already used the

Collection.Array.push({element})& Collection.save()

but i cant figure out a solution

This is My Schema

const Schema =  mongoose.Schema;

var ParticipantSchema = new Schema({

        nom:{Type:String},
        prenom:{Type:String},
        email:{Type:String}

})


var CompetitionSchema = new Schema({
    nom:String,
    date:Date,
    place:String,
    participant :[ParticipantSchema]
})

module.exports = mongoose.model("Competition",CompetitionSchema);

This is my funtion

exports.addParticipant=function(req,res){


        var newParticipant={

            "nom":req.body.nom,
            "prenom":req.body.prenom,
            "email":req.body.email

        }

        Competition.updateOne(
            { _id:req.body.id}, 
            { $push: { participant: newParticipant } },
            (err,done)=>{
               return res.json(done)
            }
        );



}

the result is always an empty object like below

{
    "_id": "5ded0eeb85daa100dc5e57bf",
    "nom": "Final",
    "date": "2019-01-01T23:00:00.000Z",
    "place": "Sousse",
    "participant": [
        {
            "_id": "5ded0eeb85daa100dc5e57c0"
        },
        {
            "_id": "5dee3c1b08474e27ac70672e"
        }
    ],
    "__v": 0
}

Upvotes: 0

Views: 213

Answers (2)

SuleymanSah
SuleymanSah

Reputation: 17858

There is no problem in your code, the only problem is that in schema definition you have Type, but it must be type.

If you update your ParticipantSchema like this, it will work:

var ParticipantSchema = new Schema({
  nom: { type: String },
  prenom: { type: String },
  email: { type: String }
});

Upvotes: 1

turbopasi
turbopasi

Reputation: 3605

You are using another Schema in the Array. This results in so-called subdocuments (https://mongoosejs.com/docs/subdocs.html). Mongoose does not populate subdocuments by default. So all you see is just the _id. You can use the populate method to see all subdocuments in detail. ( https://mongoosejs.com/docs/populate.html ) .

Example :

Competition.
  find({}).
  populate('participant').
  exec(function (err, comps) {
     //
  });

You can either use populate on the Model or on the Document. For populating a document, take a look at https://mongoosejs.com/docs/api.html#document_Document-populate . There is also a auto-populate plugin available via npm but in most cases it's not necessary : https://www.npmjs.com/package/mongoose-autopopulate .

Upvotes: 1

Related Questions