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'
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.
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.
_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.
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);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With