112

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'

3 Answers 3

176

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);
Sign up to request clarification or add additional context in comments.

9 Comments

But then it creates an array looking like [{"$oid": "dfdfsdfsg565ls"},...] instead of ["hkugh87tgkgk", ....]
That's how it's supposed to be, a list of ObjectIds. Mongoose already handle them.
What does populate() do exactly?
@KennyWorden the populate method from mongoose simulate a join in traditional relational databases. So in this case the populate will replace the friends array with an array of Users documents.
Hey, @RodrigoReis can you tell me how to write query if i want to` name -> first = 'ajay'; ` I am roughly write this but not geting any result.
|
29

I'm new to Mongoose myself, so I'm not entirely sure this is right. However, you appear to have written:

friends: [mongoose.Types.ObjectId],

I believe the property you're looking for is actually found here:

friends: [mongoose.Schema.Types.ObjectId],

It may be that the docs have changed since you posted this question though. Apologies if that's the case. Please see the Mongoose SchemaTypes docs for more info and examples.

Comments

9

I would try this.

user.friends.push(newFriend._id);

or

friends: [userSchema],

but i'm not sure if this is correct.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.