使用除 ObjectId 之外的 SchemaType 进行填充 (Mongoose)

Ard*_*atr 5 mongoose node.js

我对 node.js 和 mongoose 比较陌生,所以我一直在努力让人们为 mongoose 工作。根据猫鼬官方文档,字符串可以用作引用:

注意:ObjectId、Number、String 和 Buffer 可用作引用。

基于此,我一直在尝试填充 String 类型的字段,而不是 ObjectId 类型。然而,每次我尝试这样做时,我都会收到一个 CastError:

CastError:路径“_id”处的值“testuser”转换为 ObjectId 失败

如果有帮助,这是我的代码:

/=============== 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 }
});
Run Code Online (Sandbox Code Playgroud)

基本上,用户的设置是在创建用户后创建的。

任何帮助表示赞赏。谢谢!

Joh*_*yHK 6

虽然您可以使用ObjectIdrefs 以外的类型,但 refs 不能引用除 之外的任何字段_id。因此,要执行此操作,您必须将_idof声明UserSchema为 aString并将其值设置为您给出的相同值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 } 
});
Run Code Online (Sandbox Code Playgroud)