Bal*_*dur 3 mongoose mongodb node.js
我有以下架构(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]+'@...'
Run Code Online (Sandbox Code Playgroud)
然后我尝试获取一堆记录并填充用户:
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
Run Code Online (Sandbox Code Playgroud)
但我只想要用户的屏幕名称而不是其他任何东西(这是一个虚拟字段).但是,这会导致错误:
Cannot call method 'split' of undefined
Run Code Online (Sandbox Code Playgroud)
如果我在填充中包含电子邮件它工作正常,但我不想将电子邮件发送到客户端.有没有办法只填充虚拟字段?
由于您对'screenname'的虚拟getter中的字段'email'和'username'有依赖关系,请尝试填充screenname,email和username.
...
.populate('user', 'screenname, email, username')
...
Run Code Online (Sandbox Code Playgroud)
顺便说一句,您不应该在虚拟getter中实现业务逻辑以避免这种情况.考虑创建另一个虚拟.
| 归档时间: |
|
| 查看次数: |
6612 次 |
| 最近记录: |