web-dev-qa-db-fra.com

Comment créer un schéma Mongoose avec un tableau d'identifiants d'objet?

J'ai défini un schéma d'utilisateur de mangouste:

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);

le paramètre friends est défini comme un tableau d'identifiants d'objet. En d'autres termes, un utilisateur aura un tableau contenant les identifiants d'autres utilisateurs. Je ne suis pas sûr que ce soit la notation appropriée pour le faire.

J'essaie de pousser un nouvel ami dans le groupe d'amis de l'utilisateur actuel:

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);
    });
  });

cependant cela me donne l'erreur suivante:

TypeError: L'objet 531975a04179b4200064daf0 n'a pas de méthode 'cast'

59
user2481095

Si vous souhaitez utiliser la fonctionnalité de remplissage Mongoose, vous devez procéder comme suit:

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);

De cette façon, vous pouvez faire cette requête:

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

Vous verrez que chaque utilisateur aura un tableau d'utilisateurs (amis de cet utilisateur).

Et la manière correcte d’insérer est la suivante:

user.friends.Push(newFriend._id);
99
Rodrigo Reis

Je suis moi-même nouveau à Mongoose, donc je ne suis pas tout à fait sûr que ce soit juste. Cependant, vous semblez avoir écrit:

friends: [mongoose.Types.ObjectId],

Je crois que la propriété que vous recherchez se trouve réellement ici:

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

Il se peut que les documents aient changé depuis que vous avez posté cette question. Toutes mes excuses si c'est le cas. Veuillez consulter la documentation Mongoose SchemaTypes pour plus d'informations et d'exemples.

12
curzmg

Je voudrais essayer ceci.

user.friends.Push(newFriend._id);

ou

friends: [userSchema],

mais je ne suis pas sûr si cela est correct.

8
Gabor Laser Raz