【问题标题】:Mongoose populate a single virtual fieldMongoose 填充单个虚拟字段
【发布时间】:2013-01-14 03:38:31
【问题描述】:

我有以下架构(CoffeeScript):

adSchema = new mongoose.Schema({
  ...
  user : { type: mongoose.Schema.Types.ObjectId, ref: 'User' }
  ...
},
{
  toObject: { virtuals: true },
  toJSON: { virtuals: true }
})

userSchema = new mongoose.Schema({
  username : String
  email :
    type : String
    required : true
    index :
      unique : true
  adverts : [{ type: mongoose.Schema.Types.ObjectId, ref: 'Advert' }]
},
{
  toObject: { virtuals: true }
  toJSON: { virtuals: true }
})

userSchema.virtual('screenname').get () ->
  if this.username? then this.username else this.email.split('@')[0]+'@...'

然后我尝试获取一堆记录并填充用户:

getAdvertPage = (obj, fn) ->
  page_size = 10
  query =
    tags : obj.tag
  Advert.count query, (err, count) ->
    Advert.find(query)
    .sort(obj.sort)
    .skip((obj.page-1)*page_size)
    .limit(page_size)
    .populate('user', 'screenname')
    .exec (err, ads) ->
      ads.lastPage = (obj.page-1)*page_size + page_size >= count
      fn err, ads

但我只想要用户的屏幕名称,而不想要其他(这是一个虚拟字段)。但是,这会导致错误:

Cannot call method 'split' of undefined

如果我在填充中包含电子邮件,它可以正常工作,但我不想将电子邮件发送给客户端。有没有办法只填充一个虚拟字段?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    由于您依赖于“屏幕名称”的虚拟吸气剂中的“电子邮件”和“用户名”字段,请尝试填充屏幕名称、电子邮件和用户名。

    ...
    .populate('user', 'screenname, email, username')
    ...
    

    顺便说一句,您不应该在虚拟 getter 中实现业务逻辑,以避免出现这种情况。考虑创建另一个虚拟。

    【讨论】:

    • 是的,我知道在 populate 中包含 emailusername 将使它起作用。但是,我不想将电子邮件发送给客户。我可以在将电子邮件发送给客户之前查看结果并删除电子邮件,但我真的不想要某种黑客行为。感谢您提供有关虚拟内部业务逻辑的提示。我会调查的:)
    • 但是这种方法也会填充 _id 看起来不太好
    猜你喜欢
    • 2018-10-22
    • 2019-06-17
    • 2018-05-20
    • 2012-01-22
    • 2023-01-15
    • 1970-01-01
    • 2019-09-22
    • 2020-12-08
    • 2017-05-21
    相关资源
    最近更新 更多