所以我的这个FacilityPersonnel
模型包含字段:
var field = {
createdAt: {type: Date, default: Date.now()},
updatedAt: {type: Date, default: Date.now()},
some_id: {type: String},
fooAccessType: {
type: String,
default: 'SuperAdmin',
ref: 'AccessType'
},
}
我在{strong>控制器上尝试populate
fooAccessType
使用此功能。
FacilityPersonnel.findOne({_id:req.params.id})
.populate('fooAccessType')
.exec(function (err, doc) {
if (err) { res.status(500).json(err); return; };
res.status(200).json(doc);
})
当我删除行.populate('fooAccessType')
时,所有要查询的数据都可用且查询正在运行但如果不是,则返回此错误:
{
"stack": "Error\n at MongooseError.CastError ...",
"message": "Cast to ObjectId failed for value \"SuperAdmin\" at path \"_id\"",
"name": "CastError",
"kind": "ObjectId",
"value": "SuperAdmin",
"path": "_id"
}
为什么?感谢。
答案 0 :(得分:1)
目前,只有引用其他集合ObjectId
的{{1}}值才能用作_id
。
以下是一个讨论https://github.com/Automattic/mongoose/issues/2562
但是,它可能是未来的一项改进。
实际上,无需向refs
字段添加default
值,只需将populate
定义如下
fooAccessType
fooAccessType: {
type: String,
ref: 'AccessType'
},
population
FacilityPersonnel.findOne({_id:req.params.id})
.populate('fooAccessType')
.exec(
使用ObjectID
,population
是12字节的BSON类型,使用以下内容构建:
一个4字节的值,表示自Unix纪元以来的秒数,
一个3字节的机器标识符,
一个2字节的进程ID,
一个3字节的计数器,以随机值开始。
因此ObjectId
不正确SuperAdmin
。您可以使用UUID作为ObjectID
ObjectID
但是,上面的代码很奇怪,var uuid = require('node-uuid');
// ...
fooAccessType: {
type: String,
default: uuid.v1,
ref: 'AccessType'
},
是对fooAccesType
文档的引用。
尝试保存AccessType
文档时,应首先保存field
,然后从此已保存的AccessType
获取ObjectID
并将其分配给AccessType
最终,保存新的fooAccessType
文档。
field
var access = new AccessType({});
access.save(function(err){
if (err)
// error handling
else {
facilityperson.fooAccessType = access._id;
facilityperson.save(function(err) {
});
}
});
population