Hacer referencia a otro esquema en Mongoose

104

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

Traté de conectarlos como en el ejemplo anterior, pero no pude averiguar cómo hacerlo. Eventualmente, si puedo hacer algo como esto, mi vida sería muy fácil.

var profilePic = Post.postedBy.profilePic
Gorkem Yurtseven
fuente

Respuestas:

182

Parece que el método poblar es lo que estás buscando. Primero haga un pequeño cambio en su esquema de publicació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}],
});

Entonces haz tu modelo:

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

Luego, cuando realiza su consulta, puede completar referencias como esta:

Post.findOne({_id: 123})
.populate('postedBy')
.exec(function(err, post) {
    // do stuff with post
});
dulce
fuente
4
¿Para qué sirve el campo "ref"? No puedo encontrar documentación al respecto.
K - La toxicidad en SO está aumentando.
3
El campo de referencia @KarlMorrison significa en qué colección se buscará la identificación mencionada.
Ankur Verma
¿Cuál sería la diferencia entre poblar y addToSet?
Winnemucca
1
donde es la referencia para el by:selectro
Muhammad Umer
1
@KarlMorrison Los documentos de "ref" están enterrados en los documentos de populate: mongoosejs.com/docs/populate.html
Jeffrey Martinez
1

Respuesta tardía, pero agregando que Mongoose también tiene el concepto de Subdocumentos

Con esta sintaxis, debería poder hacer referencia a su userSchemacomo un tipo en su me postSchemagusta así:

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

Tenga en cuenta el postedBycampo actualizado con tipo userSchema.

Esto incrustará el objeto de usuario dentro de la publicación, lo que guardará una búsqueda adicional requerida mediante el uso de una referencia. A veces esto podría ser preferible, otras veces la ruta ref / populate puede ser el camino a seguir. Depende de lo que esté haciendo su aplicación.

D. Lowe
fuente