Tham chiếu một lược đồ khác trong Mongoose


104

nếu tôi có hai lược đồ như:

var userSchema = new Schema({
    twittername: String,
    twitterID: Number,
    displayName: String,
    profilePic: String,
});

var  User = mongoose.model('User') 

var postSchema = new Schema({
    name: String,
    postedBy: User,  //User Model Type
    dateCreated: Date,
    comments: [{body:"string", by: mongoose.Schema.Types.ObjectId}],
});

Tôi đã cố gắng kết nối chúng với nhau như ví dụ trên nhưng tôi không thể tìm ra cách thực hiện. Cuối cùng, nếu tôi có thể làm điều gì đó như thế này, nó sẽ giúp cuộc sống của tôi rất dễ dàng

var profilePic = Post.postedBy.profilePic

Câu trả lời:


182

Có vẻ như phương pháp cư trú là những gì bạn đang tìm kiếm. Trước tiên hãy thực hiện thay đổi nhỏ đối với giản đồ bài đăng của bạn:

var postSchema = new Schema({
    name: String,
    postedBy: {type: mongoose.Schema.Types.ObjectId, ref: 'User'},
    dateCreated: Date,
    comments: [{body:"string", by: mongoose.Schema.Types.ObjectId}],
});

Sau đó, tạo mô hình của bạn:

var Post = mongoose.model('Post', postSchema);

Sau đó, khi bạn thực hiện truy vấn của mình, bạn có thể điền các tham chiếu như sau:

Post.findOne({_id: 123})
.populate('postedBy')
.exec(function(err, post) {
    // do stuff with post
});

4
Trường "ref" dùng để làm gì? Tôi không thể tìm thấy tài liệu về nó.
K - Độc tính trong SO ngày càng lớn.

3
Trường tham chiếu @KarlMorrison có nghĩa là bộ sưu tập mà id được đề cập sẽ được tìm kiếm.
Ankur Verma

sự khác biệt giữa populate và addToSet là gì?
Winnemucca

1
đâu là tài liệu tham khảo cho by:selectro
Muhammad Umer

1
@KarlMorrison Tài liệu cho "ref" được chôn trong tài liệu dành cho populate: mongoosejs.com/docs/populate.html
Jeffrey Martinez

19

Phụ lục: Không có ai đề cập đến "Dân cư" --- rất đáng để bạn dành thời gian và tiền bạc khi xem xét Phương pháp phổ biến Mongooses: Cũng giải thích việc tham khảo tài liệu chéo

http://mongoosejs.com/docs/populate.html


1

Hậu trả lời, nhưng nói thêm rằng Mongoose cũng có khái niệm về các tài liệu phụ

Với cú pháp này, bạn sẽ có thể tham chiếu của bạn userSchemanhư một kiểu trong kiểu của bạn postSchema:

var userSchema = new Schema({
    twittername: String,
    twitterID: Number,
    displayName: String,
    profilePic: String,
});

var postSchema = new Schema({
    name: String,
    postedBy: userSchema,
    dateCreated: Date,
    comments: [{body:"string", by: mongoose.Schema.Types.ObjectId}],
});

Lưu ý trường được cập nhật postedByvới loại userSchema.

Thao tác này sẽ nhúng đối tượng người dùng vào trong bài đăng, tiết kiệm thêm một tra cứu cần thiết bằng cách sử dụng tham chiếu. Đôi khi điều này có thể tốt hơn, những lần khác, tuyến đường ref / populate có thể là cách để đi. Phụ thuộc vào những gì ứng dụng của bạn đang làm.

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.