猫鼬.js在 Find() 上膨胀子文档的 getter



是否有猫鼬.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群组讨论中的情况。 那里的作者建议将文档展平为字符串。 如果子文档具有嵌入点的合法 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.find(...)调用中调用model.spec = JSON.parse(model.spec),并为每个扁平化属性调用,但最好在一个中心位置执行此操作。

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

您可以通过将

{toJSON: {getters: true}} 选项添加到ProjectSchema定义中来调用 res.send 中的 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}
});

文档在这里。

最新更新