deep populating in mongoose

痴心易碎 提交于 2019-12-12 05:58:28

问题


I've got two schemas,

one for user and another one for post

in the user schema, I've got a property for latestPost which would be an ObjectId of an entry in the post schema

when I load up the user object,

I want to get the lastestPost as an object that includes the author's username from the user schema where the author is an ObjectId that'd match an _id field in the user schema.

the mongoose tutorials seem to use the syntax of

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

but it doesn't work

it's showing

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

but I want it to show

  latestPost:
   { 
     author:  {
      username  : something
     }
   }

how does one do something like this? is there something wrong with the design of the schema or the query?

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)
})

回答1:


Maybe just this.

I don't think you need .populate('latestPost') as your next .populate() should take care of populating the latestPost. Maybe that is interfering with the next one.

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

});



回答2:


You need to provide the model name also in populate function:

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)
})


来源:https://stackoverflow.com/questions/43461294/deep-populating-in-mongoose

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!