Mongoose.js getter 在 Find() 上膨胀子文档?
Mongoose.js getter that inflates subdocuments on Find()?
是否存在 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。那里的作者建议将文档展平为字符串。如果子文档具有嵌入点的合法 Javascript 属性(例如 {"802.11g": ...}
)
,也会发生这种情况
通过将 JSON.parse
和 JSON.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 只有在我明确要求属性值时才会被调用。该属性仍然是下面的字符串,并按如下方式传递:
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}
});
文档 here.
是否存在 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。那里的作者建议将文档展平为字符串。如果子文档具有嵌入点的合法 Javascript 属性(例如 {"802.11g": ...}
)
通过将 JSON.parse
和 JSON.stringify
指定为 Mongoose.js:
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}
});
文档 here.