Посилання на іншу схему в Мангусті


104

якщо у мене є дві схеми на кшталт:

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

Я намагався з'єднати їх разом, як на прикладі вище, але я не міг зрозуміти, як це зробити. Зрештою, якщо я можу зробити щось подібне, це зробило б моє життя дуже легким

var profilePic = Post.postedBy.profilePic

Відповіді:


182

Це здається, що метод заповнення - це те, що ви шукаєте. Спочатку внесіть невеликі зміни до вашої схеми публікації:

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

Потім зробіть свою модель:

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

Потім, роблячи запит, ви можете заповнити такі посилання:

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

4
Для чого поле "ref"? Я не можу знайти документацію на нього.
K - Токсичність в SO зростає.

3
@KarlMorrison ref field означає, в якій колекції ідентифікатор, що згадується, буде шукати.
Анкур Верма

яка буде різниця між populate та addToSet?
Winnemucca

1
де посилання на by:селекро
Мухаммед Умер

1
@KarlMorrison Документи для "ref" поховані в документах на populate: mongoosejs.com/docs/populate.html
Джеффрі Мартінес

19

Додаток: Ніхто не згадав про "Населення" --- це дуже варте вашого часу та грошей, дивлячись на метод популяції мангустів: також пояснюється перехресні документи, що посилаються

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


1

Пізня відповідь, але додавши, що у Мангуста є також поняття Субдокументи

За допомогою цього синтаксису ви зможете посилатися на свій userSchemaтип як на ваш 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}],
});

Зверніть увагу на оновлене postedByполе з типом userSchema.

Це вбудує об’єкт користувача в пост, заощадивши додатковий пошук, необхідний за допомогою посилання. Іноді це може бути кращим, в іншому випадку маршрутом ref / populate може бути шлях. Залежить від вашої програми.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.