javascript - Refererar till ett annat schema i Mongoose


om jag har två scheman som:

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

Jag försökte koppla ihop dem som exemplet ovan men jag kunde inte lista ut hur man gör det. Så småningom, om jag kan göra något liknande detta, skulle det göra mitt liv väldigt enkelt

var profilePic = Post.postedBy.profilePic

Svar #1

Det låter som om populate-metoden är det du letar efter. Börja med att göra en liten ändring i ditt post-schema:

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

Gör då din modell:

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

Sedan, när du gör din förfrågan, kan du fylla i referenser på detta sätt:

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

Svar #2

Tillägg: Ingen nämnde "Populate" --- det är verkligen värt din tid och pengar att titta på Mongooses Populate-metod: Förklarar också referenser mellan dokument

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

Svar #3

Sen svar, men lägger till att Mongoose också har konceptet Subdokument

Med denna syntax bör du kunna referera till ditt userSchema som en typ i ditt postSchema på följande sätt:

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

Observera det uppdaterade fältet postedBy med typ userSchema.

Detta kommer att bädda in användarobjektet i inlägget, vilket sparar en extra uppslagning som skulle krävas genom att använda en referens. Ibland kan detta vara att föredra, andra gånger kan referens/populera-vägen vara rätt val. Det beror på vad din applikation gör.

Relaterade artiklar