Làm thế nào để tạo lược đồ Mongoose với Mảng ID đối tượng?


82

Tôi đã xác định một lược đồ người dùng 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);

tham số friends được định nghĩa là một mảng ID đối tượng. Nói cách khác, một người dùng sẽ có một mảng chứa ID của những người dùng khác. Tôi không chắc liệu đây có phải là ký hiệu thích hợp để thực hiện việc này hay không.

Tôi đang cố gắng đẩy Một người bạn mới vào mảng bạn bè của người dùng hiện tại:

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

tuy nhiên, điều này mang lại cho tôi lỗi sau:

TypeError: Object 531975a04179b4200064daf0 không có phương thức 'ép kiểu'

Câu trả lời:


130

Nếu bạn muốn sử dụng tính năng dân cư Mongoose, bạn nên làm:

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

Bằng cách này, bạn có thể thực hiện truy vấn này:

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

Bạn sẽ thấy rằng mỗi Người dùng sẽ có một mảng Người dùng (bạn bè của người dùng này).

Và cách chèn đúng như Gabor đã nói:

user.friends.push(newFriend._id);

1
Nhưng sau đó nó tạo ra một mảng trông như [{"$oid": "dfdfsdfsg565ls"},...]thay vì["hkugh87tgkgk", ....]
CodyBugstein

2
Đó là cách nó phải như vậy, một danh sách các ObjectIds. Mongoose đã xử lý chúng.
Rodrigo Reis

Những gì populate()làm chính xác?
Kenny Worden,

@KennyWorden phương thức điền từ mongoose mô phỏng một phép nối trong cơ sở dữ liệu quan hệ truyền thống. Vì vậy, trong trường hợp này, khu dân cư sẽ thay thế mảng bạn bè bằng một mảng tài liệu Người dùng.
Rodrigo Reis

Này, @RodrigoReis bạn có thể cho tôi biết cách viết truy vấn nếu tôi muốn `name -> first = 'ajay'; Tôi đại khái là viết điều này nhưng không thu được bất kỳ kết quả nào.
Ajay Gupta

22

Bản thân tôi là người mới sử dụng Mongoose, vì vậy tôi không hoàn toàn chắc chắn rằng điều này là đúng. Tuy nhiên, dường như bạn đã viết:

friends: [mongoose.Types.ObjectId],

Tôi tin rằng tài sản bạn đang tìm thực sự được tìm thấy ở đây:

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

Có thể tài liệu đã thay đổi kể từ khi bạn đăng câu hỏi này. Xin lỗi nếu đúng như vậy. Vui lòng xem tài liệu Mongoose SchemaTypes để biết thêm thông tin và ví dụ.


8

Tôi sẽ thử điều này.

user.friends.push(newFriend._id);

hoặc là

friends: [userSchema],

nhưng tôi không chắc liệu điều này có chính xác hay không.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.