Mongoose.js getter膨胀Find()上的子文档?

时间:2015-01-28 05:10:29

标签: json node.js mongodb mongoose getter-setter

是否有一个Mongoose.js验证的反转,可以在检索父文件时膨胀子文档?我可能一直在查看文档这么长时间我没有认识到现有的功能。

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

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

因此处于Google Groups Discussion的情况。那里的作者建议将文档展平为String。如果子文档具有嵌入点的合法Javascript属性(例如{"802.11g": ...}

,也会出现这种情况

通过在Mongoose.js中指定JSON.parseJSON.stringify作为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。该属性仍然是下面的字符串,并按原样传递:

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.spec = JSON.parse(model.spec)电话中调用Model.find(...)以及每个扁平化属性,但在一个中心位置进行调用会很好。

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

1 个答案:

答案 0 :(得分:2)

您可以通过在res.send定义中添加{toJSON: {getters: true}}选项,在ProjectSchema中调用您的getter。您可能希望为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}
});

文档here