mabc224
mabc224

Reputation: 742

Mongoose data saving without _id

I am using mongoose with node.js application. I don't want _id field in record. I am using this code to save my record without _id field. But it is giving error

document must have an _id before saving

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var PlayerSchema = new Schema({
    player_id :  { type: Number },
    player_name : { type: String },
    player_age  : { type: Number },
    player_country : { type: String }
}
, { _id: false }
);

var Player =  mongoose.model('Player', PlayerSchema );

        var athlete = new Player();
        athlete.player_id = 1;
        athlete.player_name = "Vicks";
        athlete.player_age  = 20;
        athlete.player_country = "UK";

        athlete.save(function(err) {
            if (err){
                console.log("Error saving in PlayerSchema"+ err);
            }
        });

I am using mongoose version 3.8.14

Upvotes: 6

Views: 15330

Answers (3)

aakash4dev
aakash4dev

Reputation: 1176

instade of writing this

{
    player_id :  { type: Number },
    player_name : { type: String },
...}

write this:-

{
    _id :  { type: Number },
    _name : { type: String },
    _age  : { type: Number },
    _country : { type: String }
}

hence _id will be players_id

then further write code like this:-

var athlete = new Player();
        athlete._id = 1;
        athlete._name = "Vicks";
        athlete._age  = 20;
        athlete._country = "UK";

        athlete.save(function(err) {
            if (err){
                console.log("Error saving in PlayerSchema"+ err);
            }
        });

Upvotes: 0

OfirD
OfirD

Reputation: 10460

Copying an answer given on a similar Github issue comment:

The _id option exists to prevent one being created and assigned to every sub-document within your document.

So, it's not for this:

var Schema = mongoose.Schema,
ThingSchema = new Schema({    
   name: String,  
   categories: [{         
      label: {            
         type: String,            
         uppercase: true      
      },      
      value: String
   }]
}, {_id: false});
//   ^^^^^^^^^
// this won't work 

It's for this:

var Schema = mongoose.Schema,
ThingSchema = new Schema({
    name: String,
    categories: [{
       label: {
          type: String,
          uppercase: true
       },
       value: String,
       _id: false // <--- this works
    }]
}); 

Took me a while but, after running into the same problem, I found the documentation here.

Upvotes: 3

Minkesh Jain
Minkesh Jain

Reputation: 1160

Unfortunately, You can not skip having a primary key for the document but you can override the primary key content, you can define your own primary key for each document.

Try the following schema for the same.

var PlayerSchema = new mongoose.Schema({
_id :  { type: Number },
player_name : { type: String },
player_age  : { type: Number },
player_country : { type: String },

} );

I have replaced your player_id with _id. Now you have control over the primary key of the document and the system won't generate the key for you.

There are some plugins which can also do the autoincremet for your primary key. https://github.com/chevex-archived/mongoose-auto-increment. You might try these as well.

Also, about the error you are getting : Any document is an object and should be wrapped inside the curly brackets you can not define two independent object in the same document. So you are getting this error.

Upvotes: 3

Related Questions