Ссылка на другую схему в Mongoose

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

Похоже, что метод populate - это то, что вы ищете. Сначала внесите небольшие изменения в схему поста:

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
});
nicksweet
источник
4
Для чего нужно поле "ref"? Я не могу найти по нему документацию.
K - Токсичность в SO растет.
3
Поле @KarlMorrison ref означает, в какой коллекции будет выполняться поиск указанного идентификатора.
Анкур Верма
в чем будет разница между заполнением и addToSet?
Winnemucca
1
где ссылка на by:selectro
Мухаммад Умер
1
@KarlMorrison Документы для "ref" похоронены в документах для populate: mongoosejs.com/docs/populate.html
Джеффри Мартинес,
19

Приложение: никто не упомянул "заполнить" --- это очень стоит вашего времени и денег, глядя на метод заполнения Mongooses: также объясняет перекрестные ссылки на документы

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

фино
источник
1

Поздний ответ, но добавлено, что у Mongoose также есть концепция вложенных документов.

С помощью этого синтаксиса вы должны иметь возможность ссылаться на свой 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 может быть подходящим. Зависит от того, что делает ваше приложение.

Д. Лоу
источник