Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How To Create Mongoose Schema with Array of Object IDs?

I have defined a mongoose user schema:

var userSchema = mongoose.Schema({   email: { type: String, required: true, unique: true},   password: { type: String, required: true},   name: {       first: { type: String, required: true, trim: true},       last: { type: String, required: true, trim: true}   },   phone: Number,   lists: [listSchema],   friends: [mongoose.Types.ObjectId],   accessToken: { type: String } // Used for Remember Me });  var listSchema = new mongoose.Schema({     name: String,     description: String,     contents: [contentSchema],     created: {type: Date, default:Date.now} }); var contentSchema = new mongoose.Schema({     name: String,     quantity: String,     complete: Boolean });  exports.User = mongoose.model('User', userSchema); 

the friends parameter is defined as an array of Object IDs. So in other words, a user will have an array containing the IDs of other users. I am not sure if this is the proper notation for doing this.

I am trying to push a new Friend to the friend array of the current user:

user = req.user;   console.log("adding friend to db");   models.User.findOne({'email': req.params.email}, '_id', function(err, newFriend){     models.User.findOne({'_id': user._id}, function(err, user){       if (err) { return next(err); }       user.friends.push(newFriend);     });   }); 

however this gives me the following error:

TypeError: Object 531975a04179b4200064daf0 has no method 'cast'

like image 478
user2481095 Avatar asked Mar 07 '14 07:03

user2481095


People also ask

What is object ID in Mongoose?

doc.testId instanceof mongoose.Types.ObjectId; // true. There are several other values that Mongoose can cast to ObjectIds. The key lesson is that an ObjectId is 12 arbitrary bytes. Any 12 byte buffer or 12 character string is a valid ObjectId.

What is schema types ObjectId?

Types. ObjectId . A SchemaType is just a configuration object for Mongoose. An instance of the mongoose. ObjectId SchemaType doesn't actually create MongoDB ObjectIds, it is just a configuration for a path in a schema.

Does Mongoose auto generate ID?

_id field is auto generated by Mongoose and gets attached to the Model, and at the time of saving/inserting the document into MongoDB, MongoDB will use that unique _id field which was generated by Mongoose.


1 Answers

If you want to use Mongoose populate feature, you should do:

var userSchema = mongoose.Schema({   email: { type: String, required: true, unique: true},   password: { type: String, required: true},   name: {       first: { type: String, required: true, trim: true},       last: { type: String, required: true, trim: true}   },   phone: Number,   lists: [listSchema],   friends: [{ type : ObjectId, ref: 'User' }],   accessToken: { type: String } // Used for Remember Me }); exports.User = mongoose.model('User', userSchema); 

This way you can do this query:

var User = schemas.User; User  .find()  .populate('friends')  .exec(...) 

You'll see that each User will have an array of Users (this user's friends).

And the correct way to insert is like Gabor said:

user.friends.push(newFriend._id); 
like image 98
Rodrigo Reis Avatar answered Nov 07 '22 19:11

Rodrigo Reis