Mongoose.js getter充气在Find()上的子文档?

是否有一个Mongoose.jsvalidation的反例,可以膨胀的子文档,当父母被检索? 我可能一直在看这个文档,但是我没有意识到它是一个现有的function。

MongoDB的一个优点是查询规范(例如{likes: {$gt: 10, $le: 14}}本身就是Javascript对象,并且直到最近才将它们作为子文档存储在MongoDB实例中。

然而,从MongoDB 2.4升级到2.6,这些不再是有效的存储,现在得到的错误: The dollar ($) prefixed field '$or' ... is not valid for storage

因此,在这个谷歌组讨论的情况 。 那里的作者build议把这个文档变成一个String。 如果子文档具有embedded点的合法Javascript属性(例如{"802.11g": ...} ),则也会出现这种情况{"802.11g": ...}

这很容易,通过指定JSON.parseJSON.stringify作为Mongoose.js中的getter / setter:

 var ProjectSchema = new Schema({ name: { type: String, required: false, default: "New project" }, spec: {type: mongoose.Schema.Types.Mixed, set: JSON.stringify, get: JSON.parse}, }); 

但是,如果我明确地要求属性值,getter才会被调用。 该属性仍然是一个string下面,并传递如下:

 Project.findById(req.params.projectId, function(err, project) { console.log("......"+(typeof project.spec)) // project.spec is an object! res.send(project); // project.spec is a String! }); 

很明显,我可以在每个Model.find(...)调用中调用model.spec = JSON.parse(model.spec) ,并为每个展开的属性调用model.spec = JSON.parse(model.spec) ,但是在一个中心位置执行它会很好。

https://groups.google.com/forum/?fromgroups=#!topic/mongoose-orm/8AV6aoJzdiQ

您可以通过在ProjectSchema定义中添加{toJSON: {getters: true}}选项来调用res.send{toJSON: {getters: true}} 。 你可能想要为toObject选项启用它,例如将文档传递给console.log

 var ProjectSchema = new Schema({ name: { type: String, required: false, default: "New project" }, spec: {type: mongoose.Schema.Types.Mixed, set: JSON.stringify, get: JSON.parse}, }, { toJSON: {getters: true}, toObject: {getters: true} }); 

文档在这里 。