我正在使用Express,我正在寻找一种方便的方法来转换这种对象(来自请求 req.body.myObject
):
{
"name": "Foo",
"someNumber": "23",
"someBoolean": "on"
}
进入这个Schema的一个实例:
var myObjectSchema = new Schema({
name: String,
someNumber: Number,
someBoolean: Boolean
});
请注意,第一个对象来自请求,因此完全由Strings完成。
有没有一些很好的方法来实现这一目标?如果没有,您对如何将此功能实现为中间件有任何建议吗?
通过引用这个线程 Mongoose:将JS对象直接插入db 我发现是的,这是一个内置功能。
您只需构建一个新模型,将请求值(来自表单)作为参数传递:
function add(req, res){
new Contact(req.body.contact).save(function(err){
console.log("Item added");
res.send();
});
};
它会自动为您转换内容!
我知道这个答案已被接受了,但我想指出,猫鼬为你照顾大部分的演员......大部分时间。虽然mongoose这样做很方便,但它抽象了mongo的真实行为。例如,mongoose允许你做这样的事情:
PersonModel.findById("4cdf00000000000000007822", ...);
但是,如果您尝试直接查询数据库(没有mongoose),这样就可以了 不 工作:
PersonCollection.find({_id: "4cdf00000000000000007822"}, ...);
这是因为ObjectIds不是字符串......它们是对象。在内部,mongoose将该字符串转换为ObjectId,然后对数据库执行查询,以便最终查询看起来像这样:
PersonCollection.find({_id: ObjectId("4cdf00000000000000007822")}, ...);
此外,模式中的每个路径都有一个“脚轮”方法。这是一种私有方法,但在您需要它时它会非常方便。 请注意那个 caster
下面描述的方法是未经授权的,并且可以在没有警告的情况下进行更改。自行承担使用风险 (抱歉叫喊):
// Use PersonModel.schema.paths() to get all paths and loop over them if you want
var key = "name";
var pathObj = PersonModel.schema.path( key );
if( !pathObj ) pathObj = PersonModel.schema.virtualpath( key );
if( !pathObj ) { /* not found: return, continue, exit, whatever */ }
// UNDOCUMENTED: USE AT YOUR OWN RISK
var caster = pathObj.caster || pathObj;
var castedValue = caster.cast( req.body.name );
为什么我知道这个?因为如果你想使用mongo的一些更高级的功能,比如聚合,你需要在构建管道时投射你自己的值。我还需要为使用的某些查询手动转换值 $in
操作员...也许这不再需要了。重点是,如果您在获得预期结果时遇到问题,请尝试自己投射值。
如果模式是静态的,理论上可以采用惰性,非复杂的方式,只需硬编码值而不是传递对象本身:
var someObject = {
name: "Foo",
someNumber: "23",
someBoolean: "on"
}
var myObjectSchema = new Schema({
name: someObject.name,
someNumber: parseInt(someObject.someNumber, 10),
someBoolean: (someObject.someBoolean == "on")
});
可能不是您正在寻找的答案,但如果没有更好的可能,可能需要考虑。