使用 ObjectId 以外的 SchemaTypes 来表示人口(Mongoose)

Posted

技术标签:

【中文标题】使用 ObjectId 以外的 SchemaTypes 来表示人口(Mongoose)【英文标题】:Using SchemaTypes other than ObjectId for Population (Mongoose) 【发布时间】:2014-06-23 05:43:59 【问题描述】:

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

注意:ObjectId、Number、String 和 Buffer 都可以作为 refs 使用。

基于此,我一直在尝试填充 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 
);

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

感谢任何帮助。谢谢!

【问题讨论】:

如果像我一样,谷歌在寻找“如何创建引用_id以外的字段的外键”时指出了这个答案,你可以看看这个问题:***.com/q/19287142/488666跨度> 【参考方案1】:

虽然您可以将ObjectId 以外的类型用于引用,但引用不能引用除_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  
);

【讨论】:

这似乎成功了,谢谢! mongoose 网站上的示例现在也更有意义了。另一个小问题:我应该将_id 设置为唯一属性还是将_username 作为唯一属性就足够了? @Ardatr _id 始终是必需且唯一的,因此没有必要。 太棒了,我很感激@JohnnyHK!

以上是关于使用 ObjectId 以外的 SchemaTypes 来表示人口(Mongoose)的主要内容,如果未能解决你的问题,请参考以下文章

mongodb:从 json 查询中的 ObjectID 中提取时间戳

MongoDb - 要创建一个新的ObjectId,请尝试`Mongoose.Types.ObjectId`而不是使用`Mongoose.Schema.ObjectId`

变量名:“objectId”或“idObject”?

使用种子字符串在猫鼬中创建 ObjectId

使用种子字符串在猫鼬中创建 ObjectId

如何使用 rmongodb 按 ObjectId 查询文档