我知道这个答案已经被接受了,但我想指出猫鼬会为你处理大部分的演员阵容......大部分时间。虽然 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
运算符的某些查询手动转换值……也许不再需要了。重点是,如果您无法获得预期的结果,请尝试自己转换值。