Populate不会仅检索整个引用对象的ID

时间:2016-09-28 13:47:45

标签: mongodb mongoose

我一直在阅读有关此问题的一些答案,但我仍然无法让它发挥作用。

我的模型对象没有深度嵌套,非常简单。它的事件包含参加他们的用户列表以及拥有他们参加过的事件列表的用户。像这样:

let DinnerSchema = new mongoose.Schema({
  date: {
    type: Date,
    unique: true,
    timestamps: true,
    required: true
  },
  title:{type: String, require: true},
  attending: [{
    type: mongoose.Schema.Types.ObjectId,
    ref: 'User'
  }]
})

和用户:

let UserSchema = new mongoose.Schema({
  email: {
    type: String,
    lowercase: true,
    unique: true,
    required: true
  },
  name:{ type: String, require: true },
  password: {type: String ,required: true},
  dinners: [{
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Dinner'
  }]
})

为了清楚起见,这是使用填充的整个路线:

userpage.get('/', authCheck, (req, res) => {
  const options = { _id: '57ebbf48bd6914036f99acc7' }
  return Dinner
  .findOne(options)
  .populate('User', 'name') //I'VE TRIED ADDING 'name' BASED ON SOME ANSWERS I SAW 
  .exec((err, newDinner) => {
    if (err) {
      console.log(err)
      res.status(400).end()
    }
    console.log(newDinner) // SHOW'S USERS ID'S BUT NO OTHER FIELDS
    return res.json({
        sucsess: true,
        data: newDinner
      })
  })
})

如果我在数据库本身中理解正确,那么应该只引用另一个模型而不是实际上所有的字段,并且连接发生在填充中。我的数据库结构显示只是参考,所以没关系。

我已经尝试指定我所追踪的字段的名称(在这种情况下是名称字段),但这不起作用。

我的人口结果总是如下所示,并且除了_id之外没有显示任何其他字段:

{
 _id: 57ebbf48bd6914036f99acc7,
  date: 2016-09-27T22:00:00.000Z,
  title: '1',
  __v: 0,
  attending: [ 57ebbcf02c39997f9cf26891, 57ebbdee098d3c0163db9905 ] 
}

我在这里搞砸了什么?

2 个答案:

答案 0 :(得分:2)

在mongoose中,populate接收4个参数。

  1. 路径
  2. 选择(要返回的字段),
  3. 条件
  4. 选项(如{limit:10})
  5. 在你的情况下,你没有通过正确的路径来填充。它应该是

    userpage.get('/', authCheck, (req, res) => {
      const options = { _id: '57ebbf48bd6914036f99acc7' }
      return Dinner
      .findOne(options)
      .populate('attending', 'name') 
      .exec((err, newDinner) => {
        if (err) {
          console.log(err)
          res.status(400).end()
        }
        console.log(newDinner) // SHOW'S USERS ID'S BUT NO OTHER FIELDS
        return res.json({
            sucsess: true,
            data: newDinner
          })
      })
    })
    

    现在它将返回所有参加用户的名字。

答案 1 :(得分:1)

您需要填充attending - 这是您在晚餐架构中的用户参考