11

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

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

进入这个模式的一个实例:

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

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

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

4

3 回答 3

11

通过参考这个线程Mongoose : Inserting JS object directly into db我发现是的,有一个内置功能。

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

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

它会自动为您转换内容!

于 2012-08-22T18:47:02.433 回答
2

我知道这个答案已经被接受了,但我想指出猫鼬会为你处理大部分的演员阵容......大部分时间。虽然 mongoose 这样做很方便,但它抽象了 mongo 的真实行为。例如,猫鼬可以让你做这样的事情:

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

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

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

这是因为 ObjectId 不是字符串……它们是对象。在内部,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运算符的某些查询手动转换值……也许不再需要了。重点是,如果您无法获得预期的结果,请尝试自己转换值。

于 2014-08-26T22:24:46.413 回答
0

如果模式是静态的,理论上可以采用惰性、不复杂的方式,只对值进行硬编码,而不是传递对象本身:

var someObject = {
    name: "Foo",
    someNumber: "23",
    someBoolean: "on"
}

var myObjectSchema = new Schema({
    name: someObject.name,
    someNumber: parseInt(someObject.someNumber, 10),
    someBoolean: (someObject.someBoolean == "on")
});

可能不是您正在寻找的答案,但如果没有更好的答案,可能需要考虑。

于 2012-08-21T04:15:20.397 回答