3

我正在使用 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”时,不会查询实际的“事实”。只有在明确选择“事实”之后,我才能确保包含这些内容。IE:

 //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.pathswhere subclassedSchemais a subclass of 来访问模式的所有已定义字段factSchema

这行得通,但我可以相信这在未来的版本中是稳定的吗?有什么更好的、不那么骇人听闻的方法来解决这个问题吗?

4

1 回答 1

7

2.x 分支中没有更好的方法。Schema.paths 在 3.x 中也没有改变,因此在可预见的将来这样做是安全的。

3.x 具有新的select语法,允许简单地调用factModel.findOne(..).select('+facts').exec(callback)以实现所需的结果。

于 2012-06-15T20:23:45.493 回答