我知道这个答案已经被接受了,但是我想指出mongoose会为您处理大部分的类型转换...大多数情况下。尽管mongoose实现了这个便利功能,但它也把mongo真正的行为隐藏起来了。例如,mongoose让你可以像这样做:
PersonModel.findById("4cdf00000000000000007822", ...);
然而,如果你尝试直接查询数据库(不使用mongoose),这样是无法实现的:
PersonCollection.find({_id: "4cdf00000000000000007822"}, ...)
这是因为ObjectIds不是字符串,而是对象。在内部,mongoose将该字符串转换为ObjectId,然后对数据库执行查询,以便最终的查询看起来像这样:
PersonCollection.find({_id: ObjectId("4cdf00000000000000007822")}, ...)
此外,模式中的每个路径都有一个“转换器”方法。这是一个私有方法,但当您需要它时,它非常方便。请注意,下面描述的
caster
方法未经记录,可能会在没有警告的情况下更改。使用时请自行承担风险(抱歉,我不是故意大声说话)。
var key = "name";
var pathObj = PersonModel.schema.path( key );
if( !pathObj ) pathObj = PersonModel.schema.virtualpath( key );
if( !pathObj ) { }
var caster = pathObj.caster || pathObj;
var castedValue = caster.cast( req.body.name );
我知道这是为什么?因为如果你想使用MongoDB的一些高级功能,例如聚合,你需要在构建管道时自己转换数据类型。我也需要手动转换某些查询的值,这些查询使用了$in
操作符...也许现在不再需要这样做了。重点是,如果你无法获得预期的结果,请尝试自己转换数值。
myObject[name]:name, myObject[someNumber]:23
中获取信息,并且默认情况下将每个属性设置为字符串来构建myObject! - Renato Gama