Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 在Find()上膨胀子文档的Mongoose.js getter?_Json_Node.js_Mongodb_Mongoose_Getter Setter - Fatal编程技术网

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

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时,它们不再有效,因此无法存储,我现在收到错误:美元($)前缀字段“$或”…对存储无效 因此,我处于这种情况。作者建议将文档展平为字符串。如果子文

是否存在Mongoose.js验证的反向,在检索父文档时会使子文档膨胀?我可能已经看了这么长时间的文档,我不知道它是什么现有的功能

MongoDB的一个优点是,查询规范(例如,
{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
中的getter
ProjectSchema定义的
选项。你试过了吗?你可能也想在
toObject
中使用它。@NeilLunn同意保持可搜索性是值得的,所以选择了
{set:foo,get:unfoo
}其中
函数foo(val){return JSON.stringify(val)。替换(/“\$/,“\'”\“\”\u$');}
函数unfoo(val){返回JSON.parse(val.replace(/\“\u\$/,“\”$);}