是否有将基于字符串的JSON转换为Mongoose Schema对象实例的本地功能

Is there a native feature to convert string based JSON into Mongoose Schema object instance?

本文关键字:Schema Mongoose 对象 实例 功能 转换 JSON 字符串 是否      更新时间:2023-09-26

我正在使用Express,我正在寻找一种方便的方法来转换这种对象(根据请求req.body.myObject):

{
  "name": "Foo",
  "someNumber": "23",
  "someBoolean": "on"
}

进入此模式的实例:

var myObjectSchema = new Schema({
    name: String,
    someNumber: Number,
    someBoolean: Boolean
});

请注意,第一个对象来自请求,因此它完全由Strings组成。

有什么好方法可以做到这一点吗?如果没有,您对如何将此功能作为中间件来实现有什么建议吗???

通过参考这个线程Mongoose:将JS对象直接插入数据库,我发现是的,这是一个内置的功能。

您只需构建一个新模型,将请求值(来自表单)作为参数:

function add(req, res){
    new Contact(req.body.contact).save(function(err){
        console.log("Item added");
        res.send();
    });
};

它会自动为您转换内容!

我知道这个答案已经被接受了,但我想指出的是,猫鼬为你负责大部分选角。。。大多数时候。虽然猫鼬这样做很方便,但它抽象了猫鼬的真实行为。例如,猫鼬可以让你做这样的事情:

PersonModel.findById("4cdf00000000000000007822", ...);

但是,如果您尝试直接查询数据库(没有猫鼬),这将不起作用

PersonCollection.find({_id: "4cdf00000000000000007822"}, ...);

这是因为ObjectId不是字符串。。。它们是物体。在内部,mongoose将该字符串转换为ObjectId,然后对数据库执行查询,这样最后的查询看起来有点像:

PersonCollection.find({_id: ObjectId("4cdf00000000000000007822")}, ...);

此外,模式中的每个路径都有一个"caster"方法。这是一个私有方法,但当你需要它时,它非常方便。请注意,下面描述的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")
});

可能不是你想要的答案,但如果没有更好的答案,可能需要考虑。