簡體   English   中英

Mongoose填充單個虛擬字段

[英]Mongoose populate a single virtual field

我有以下架構(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

如果我在填充中包含電子郵件它工作正常,但我不想將電子郵件發送到客戶端。 有沒有辦法只填充虛擬字段?

由於您對'screenname'的虛擬getter中的字段'email'和'username'有依賴關系,請嘗試填充screenname,email和username。

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

順便說一句,您不應該在虛擬getter中實現業務邏輯以避免這種情況。 考慮創建另一個虛擬。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM