遇到一个CastError
在 Mongoose 中填充嵌套 ObjectId 引用时(值{}
)显然是valid,只要它们在保存到架构时不会被阻止。
有兴趣在服务器端解决此问题以防止将来出现格式错误的数据,但是,我知道不从客户端保存这些值是一个好主意。事实上,一个空对象can保存到 Mongoose 模式type: mongoose.Schema.Types.ObjectId
然后抛出一个CastError
使用人口是我最关心的问题。
示例数据:
// representation of data in model
{
"_id": /* ObjectId */,
"refA": {} // empty object,
"refB": /* ObjectId */,
"refC": /* ObjectId */
}
方法示例:
// mongoose query with population
function populator(id, cb) {
// find by string or object id
var query = Schema.findById(id);
// population of query
query.populate({
// string of fields to expand
path: 'refA refB refC',
// option to include virtuals
options: {toJSON: {virtuals: true}}
});
// return executed query,
// optional callback
return _.isFunction(cb) ? query.exec(cb) : query.exec();
}
结果错误:
// error in console
{ [CastError: Cast to ObjectId failed for value "[object Object]" at path "_id"]
message: 'Cast to ObjectId failed for value "[object Object]" at path "_id"',
name: 'CastError',
type: 'ObjectId',
value: {},
path: '_id' }
这可以被认为是 Mongoose 中的一个错误吗?
Edit:
猫鼬允许{}
保存到上述架构中。
示例架构:
var schema = mongoose.Schema(mongoose.Schema{
"refA": {type: mongoose.Schema.Types.ObjectId, ref: 'ReferenceA'},
"refB": {type: mongoose.Schema.Types.ObjectId, ref: 'ReferenceB'},
"refC": {type: mongoose.Schema.Types.ObjectId, ref: 'ReferenceC'}
});
处理 PUT 的方法:
var id = /* existing document */,
body = {"refA": {}};
query = Table.findByIdAndUpdate(id, {$set: body}).lean();
query.exec(function(err, record) { /* ... */ });
确定 Mongoose 不应该允许{}
保存为 ObjectId 类型。在保存新文档/处理 POST 时尚未测试过这样做。