Referenciar outro esquema no Mongoose


104

se eu tiver dois esquemas como:

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

Tentei conectá-los como no exemplo acima, mas não consegui descobrir como fazer isso. Eventualmente, se eu pudesse fazer algo assim, tornaria minha vida muito fácil

var profilePic = Post.postedBy.profilePic

Respostas:


182

Parece que o método populate é o que você está procurando. Primeiro, faça uma pequena alteração em seu esquema de postagem:

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

Em seguida, faça o seu modelo:

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

Então, ao fazer sua consulta, você pode preencher referências como esta:

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

4
Para que serve o campo "ref"? Não consigo encontrar documentação sobre isso.
K - A toxicidade em SO está crescendo.

3
O campo @KarlMorrison ref significa em qual coleção o id mencionado será pesquisado.
Ankur Verma

qual seria a diferença entre populate e addToSet?
Winnemucca

1
onde é referência para by:selectro
Muhammad Umer

1
@KarlMorrison Os documentos para "ref" estão enterrados nos documentos de populate: mongoosejs.com/docs/populate.html
Jeffrey Martinez


1

Resposta tardia, mas acrescentando que o Mongoose também tem o conceito de subdocumentos

Com esta sintaxe, você deve ser capaz de fazer referência a seu userSchemacomo um tipo em sua postSchemaforma:

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

Observe o postedBycampo atualizado com o tipo userSchema.

Isso irá incorporar o objeto do usuário na postagem, salvando uma pesquisa extra necessária ao usar uma referência. Às vezes, isso pode ser preferível, outras vezes, a rota ref / populate pode ser o caminho a percorrer. Depende do que seu aplicativo está fazendo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.