Jak utworzyć schemat Mongoose z tablicą identyfikatorów obiektów?

85

Zdefiniowałem schemat użytkownika Mongoose:

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

parametr friends jest zdefiniowany jako tablica identyfikatorów obiektów. Innymi słowy, użytkownik będzie miał tablicę zawierającą identyfikatory innych użytkowników. Nie jestem pewien, czy jest to właściwa notacja, aby to zrobić.

Próbuję wypchnąć nowego znajomego do tablicy znajomych bieżącego użytkownika:

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

jednak daje mi to następujący błąd:

TypeError: Object 531975a04179b4200064daf0 nie ma metody „cast”

user2481095
źródło

Odpowiedzi:

135

Jeśli chcesz korzystać z funkcji wypełniania Mongoose, powinieneś zrobić:

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

W ten sposób możesz wykonać to zapytanie:

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

Zobaczysz, że każdy użytkownik będzie miał tablicę użytkowników (znajomych tego użytkownika).

A właściwy sposób wstawiania jest taki, jak powiedział Gabor:

user.friends.push(newFriend._id);
Rodrigo Reis
źródło
1
Ale potem tworzy tablicę wyglądającą jak [{"$oid": "dfdfsdfsg565ls"},...]zamiast["hkugh87tgkgk", ....]
CodyBugstein
2
Tak powinno być, lista identyfikatorów obiektów. Mongoose już sobie z nimi poradził.
Rodrigo Reis
Co populate()dokładnie robi?
Kenny Worden,
@KennyWorden metoda populate z mangusty symuluje sprzężenie w tradycyjnych relacyjnych bazach danych. W tym przypadku wypełnienie zastąpi tablicę znajomych tablicą dokumentów użytkowników.
Rodrigo Reis
Hej, @RodrigoReis, czy możesz mi powiedzieć, jak napisać zapytanie, jeśli chcę `name -> first = 'ajay'; `` Z grubsza to piszę, ale nie otrzymuję żadnego wyniku.
Ajay Gupta
22

Sam jestem nowy w Mongoose, więc nie jestem do końca pewien, czy to prawda. Wygląda jednak na to, że napisałeś:

friends: [mongoose.Types.ObjectId],

Uważam, że nieruchomość, której szukasz, znajduje się tutaj:

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

Możliwe, że dokumenty uległy zmianie od czasu opublikowania tego pytania. Przepraszam, jeśli tak jest. Aby uzyskać więcej informacji i przykładów, zobacz dokumentację Mongoose SchemaTypes .

curzmg
źródło
8

Spróbowałbym tego.

user.friends.push(newFriend._id);

lub

friends: [userSchema],

ale nie jestem pewien, czy to prawda.

Gabor Laser Raz
źródło