我正在使用Mongoosejs连接MongoDB。
考虑以下设计的架构示例:
var factSchema= new Schema({
facts: { type:[require('./fact')], select:false}
,roles: {type: [String], required: true, index: {unique: false}}
,c: {type: {}, default: {}} //all calculated stuff based on facts
}
明确指出,当正常查询'factSchema'时,不会查询实际的'事实'。只有在明确地对“事实”进行选择之后,才能确保包含这些内容。我:
//factModel is a model derived from factSchema
factModel.findOne({_id:input.id})
.select(["facts","roles","c"]).exec(function(err,result){//do something});
这适用于这个微不足道的案例。 但是我已经将factSchema(关于如何:https://groups.google.com/forum/?fromgroups#!searchin/mongoose-orm/INHERIT/mongoose-orm/aeqGRRnpFvg/lbfIA54hiwYJ的信息)子类化,并且我想查询特定子类的所有字段,但它只在运行时知道我正在查询哪个子类。换句话说,我无法明确指定我想要返回的字段。
我该怎么做?
一个可能的解决方案似乎是(?)我可以通过subclassedSchema.paths
来subclassedSchema
factSchema
的子类来查看模式的所有已定义字段。
这有效,但我可以相信这在未来版本中是稳定的吗?有什么更好,更少的hackish方式来解决这个问题?
答案 0 :(得分:7)
2.x分支中没有更好的方法。 Schema.paths在3.x中没有变化,因此在可预见的将来可以安全地执行此操作。
3.x具有新的select
语法,只需调用factModel.findOne(..).select('+facts').exec(callback)
即可获得所需的结果。