使用除ObjectId以外的SchemaTypes(Mongoose)
我对node.js和mongoose比较陌生,所以我一直试图让人口为mongoose工作。 根据官方的mongoose文档,string可以用作参考:
注意:ObjectId,数字,string和缓冲区是有效的作为参考。
基于此,我一直在试图填充Stringtypes的字段,而不是ObjectId。 但是,每次我尝试这样做,我都会得到一个CastError:
CastError:投射到ObjectId的path“_id”的值“testuser”失败
如果有帮助,这是我的代码:
/=============== In user.js ===============/ var UserSchema = new mongoose.Schema({ _username: { type: String, required: true, unique: true }, password: { type: String, required: true }, date_created: { type: Date, required: true, default: Date.now() }, last_accessed: { type: Date, required: true }, admin_access: { type: Boolean, required: true } }); UserSchema.post('save', function(user) { // Settings Model var Settings = require('./settings'); var setting = new Settings.SettingsModel({ _user: user._username }); setting.save(function(err) { if (err) throw err; console.log('Successfully created settings for user: ' + setting); Settings.SettingsModel.findOne({ _user: user._username }, function(err, setting) { Settings.SettingsModel.populate(setting, { path: '_user' }, function(err, setting) { if (err) throw err; console.log('User of setting is ' + setting._user); }); }); }); }); /=============== In settings.js ===============/ var SettingsSchema = new mongoose.Schema({ _user: { type: String, ref: 'User', unique: true }, defaultCurrency: { type: String, default: 'USD', required: true }, secondaryCurrency: { type: String } });
基本上,用户的设置是在创build用户之后创build的。
任何帮助表示赞赏。 谢谢!
虽然你可以使用ObjectId
以外的types作为引用,但引用不能引用除_id
之外的任何字段。 所以要做到这一点,你必须将UserSchema
_id
声明为String
,并将其值设置为与给予username
值相同的值:
var UserSchema = new mongoose.Schema({ _id: { type: String }, _username: { type: String, required: true, unique: true }, password: { type: String, required: true }, date_created: { type: Date, required: true, default: Date.now() }, last_accessed: { type: Date, required: true }, admin_access: { type: Boolean, required: true } });