使用除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 } });