使用 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`