2017-04-17 3 views
0

ich zwei Schemata haben,tief Bestücken in Mungo

eine für Benutzer und eine andere für die Zeit nach

im Benutzerschema habe ich eine Eigenschaft für latestPost bekam die eine ObjectId eines wäre Eintrag in der Post-Schema

, wenn ich das Benutzerobjekt laden,

ich die lastestPost als Objekt erhalten möchten, dass der Autor die Benutzernamen aus dem Schema enthält, wo der Autor ist ein ObjectId, die ein Match würde _id Feld im Benutzerschema.

die Mungo-Tutorials scheinen die Syntax von

User.findOne({ _id: req.user.id}) 
.populate('latestPost') 
.populate({ path: 'latestPost', populate: 'author'}) 

aber es funktioniert nicht

es zeigt

{ _id: 58f54fa51febfa307d02d356, 
    username: 'test', 
    email: '[email protected]', 
    firstName: 'test', 
    lastName: 'test', 
    __v: 0, 
    latestPost: 
    { _id: 58f54fa51febfa307d02d357, 
    user: 58f54fa51febfa307d02d356, 
    author: 58f54fa51febfa307d02d356, 
    date: 2017-04-17T23:28:37.960Z, 
    post: 'Test', 
    __v: 0 } } 

aber ich will es

latestPost: 
    { 
    author: { 
     username : something 
    } 
    } 
zeigen, nicht zu verwenden,

Wie macht man so etwas? stimmt etwas mit dem Entwurf des Schemas oder der Abfrage nicht?

var UserSchema = new Schema({ 
    username : String, 
    firstName : String, 
    lastName : String, 
    email  : String, 
    password : String, 
    views  : Number, 
    latestPost  : { type: Schema.Types.ObjectId, ref: 'Post' } 
}); 

var PostSchema = new Schema({ 
    user  : { type: Schema.Types.ObjectId, ref: 'User' }, 
    author : { type: Schema.Types.ObjectId, ref: 'User' }, 
    date  : Date, 
    body  : String 
}); 

var User  = mongoose.model('User', UserSchema); 
var Post  = mongoose.model('Post', PostSchema); 

User.findOne({ _id: req.user.id}) 
.populate('latestPost') 
.populate({ path: 'latestPost', populate: 'author'}) 
.exec(function(err, user) { 
    if (err) res.json(err) 
    console.log(user) 
}) 
+0

Warum sagt es "Bio" in Ihrer Ausgabe? – Mikey

+0

Entschuldigung, alter Code. Aktualisierter Beitrag – totalnoob

Antwort

4

Vielleicht gerade.

Ich glaube nicht, Sie brauchen .populate('latestPost') als Ihre nächste .populate() sollte darauf achten, die latestPost bevölkern. Vielleicht stört das den nächsten.

User.findOne({ _id: req.user.id }).populate({ 
    path: 'latestPost', 
    model: 'Post', 
    populate: { 
     path: 'author', 
     model: 'User' 
    } 
}).exec(function (err, user) { 

}); 
0

Sie benötigen die Modellbezeichnung auch in bevölkern Funktion zur Verfügung zu stellen:

var UserSchema = new Schema({ 
    username : String, 
    firstName : String, 
    lastName : String, 
    email  : String, 
    password : String, 
    views  : Number, 
    latestPost  : { type: Schema.Types.ObjectId, ref: 'Post' } 
}); 

var PostSchema = new Schema({ 
    user  : { type: Schema.Types.ObjectId, ref: 'User' }, 
    author : { type: Schema.Types.ObjectId, ref: 'User' }, 
    date  : Date, 
    body  : String 
}); 

var User  = mongoose.model('User', UserSchema); 
var Post  = mongoose.model('Post', PostSchema); 

User.findOne({ _id: req.user.id}) 
.populate('latestPost') 
.populate({ 
    model: 'Post', 
    path: 'latestPost', 
    select: 'author -_id' 
}) 
.exec(function(err, user) { 
    if (err) res.json(err) 
    console.log(user) 
})