2015-09-13 41 views
0

我想用Mongoose ORM检查一些MongoDB字段的最佳方法。已经用Mongoose检查MongoDB字段

const userSchema = new Schema({ 
    last_name: { 
    type: String, 
    select: false, 
    } 
}); 

userSchema.virtual('last_name_initial').get(function() { 
    return this.last_name.substr(0,1).toUpperCase(); 
}); 

不会去做这件事,因为last_name设置为select: false,很显然,我不想当你指定{select: false}发送回last_name

+0

https://github.com/Automattic/mongoose/issues/1195 – ZeMoon

回答

2

在任何领域中的模式,现场被排除在查询默认情况下。所以,在这种情况下,你的虚拟现场只会工作已经质疑这样的目标:

User.find().select('+last_name').exec(function (err, users) { 

    //The virtual field should be available here. 
    console.log(users[0].last_name_initial); 
}); 

如果你想在虚拟领域始终可用,而不必明确包括选择字段,则这将是最好使用另一种方法,而不是{select: false}。您可以排除默认领域

一种方式是通过重写toJSON方法(source有同样的问题,因为你)

userSchema.methods.toJSON = function() { 
    var obj = this.toObject() 
    delete obj.last_name 
    return obj 
} 

注:使用这​​种方法,你还应该设置选项{虚函数: true}为toJSON。

userSchema.set('toJSON', {virtuals: true}); 
+1

尝试你的答案并没有因为覆盖的toJSON不包括虚拟领域的工作,所以我已经结束了删除虚拟域和这样做: 'userSchema.methods.toJSON = function(){let obj = this.toObject(); obj.last_name_initial = obj.last_name.substr(0,1).toUpperCase();删除obj.last_name;返回obj;};' –

+0

是的...这也很好...将检查有关虚拟选项的toJSON – ZeMoon