mongoose无法使用String

时间:2016-02-12 13:01:25

标签: node.js mongodb mongoose mongoose-populate

所以我的这个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"
}

为什么?感谢。

1 个答案:

答案 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( 使用ObjectIDpopulation是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