Json 在Find()上膨胀子文档的Mongoose.js getter?
是否存在Mongoose.js验证的反向,在检索父文档时会使子文档膨胀?我可能已经看了这么长时间的文档,我不知道它是什么现有的功能 MongoDB的一个优点是,查询规范(例如,Json 在Find()上膨胀子文档的Mongoose.js getter?,json,node.js,mongodb,mongoose,getter-setter,Json,Node.js,Mongodb,Mongoose,Getter Setter,是否存在Mongoose.js验证的反向,在检索父文档时会使子文档膨胀?我可能已经看了这么长时间的文档,我不知道它是什么现有的功能 MongoDB的一个优点是,查询规范(例如,{likes:{$gt:10,$le:14}}}本身就是Javascript对象,直到最近才将它们作为子文档存储在MongoDB实例中 但是,从MongoDB 2.4升级到2.6时,它们不再有效,因此无法存储,我现在收到错误:美元($)前缀字段“$或”…对存储无效 因此,我处于这种情况。作者建议将文档展平为字符串。如果子文
{likes:{$gt:10,$le:14}}}
本身就是Javascript对象,直到最近才将它们作为子文档存储在MongoDB实例中
但是,从MongoDB 2.4升级到2.6时,它们不再有效,因此无法存储,我现在收到错误:美元($)前缀字段“$或”…对存储无效
因此,我处于这种情况。作者建议将文档展平为字符串。如果子文档具有嵌入点的合法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.spec=JSON.parse(model.spec)
。查找(…)
并为每个展开的属性调用,但最好在一个中心位置执行
您可以在
res.send
中调用getter,方法是将{toJSON:{getters:true}}
选项添加到ProjectSchema
定义中。您可能希望对toObject
选项以及将文档传递到控制台.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}
});
文档。那么,您想在文档数据库中以字符串形式存储数据结构,而文档数据库只支持存储数据结构吗?如果您看不出这里有什么难以置信的错误,我不确定我是否真的能帮到您。@NeilLunn,OP想要保存的数据结构的一部分似乎使用了带美元前缀的键,因此它不能被保存直接存储。您是否尝试过mongoose的virtuals?因为您都在观看。您不打算查询我收集的数据,因此替换内容实际上并不重要,或者您可以使用相同的规则集筛选查询生成。但只需将保留字符替换为合法的替换项。至于MongoDB所做的事情,
$
是r保留给操作员(以及您正在存储的内容)以及
,它在点表示法中的位置。因此我个人会用另一层替换保留字符(mongoose并不是真正独立的)因此,至少我能够查询是否需要。@user645715您应该能够通过添加{toJSON:{getters:true}来调用res.send
中的getterProjectSchema定义的
选项。你试过了吗?你可能也想在toObject
中使用它。@NeilLunn同意保持可搜索性是值得的,所以选择了{set:foo,get:unfoo
}其中函数foo(val){return JSON.stringify(val)。替换(/“\$/,“\'”\“\”\u$');}
和函数unfoo(val){返回JSON.parse(val.replace(/\“\u\$/,“\”$);}