mongoose + Node.js / Express中是否有一种方法可以定义外键字段与我在模型中引用该字段的关系?我的问题是我有一个mongo数据库,其中我的外键都被格式化为'exampleId'而不是'example'。我可以直接调出'exampleId'然后它会导致奇怪的事情,例如当我填充'exampleId'而不是'example'时(这是令人困惑的,因为一旦填充,它现在是'示例'本身而不是它的id)。
以下是我现在的工作方式,它适用于我的graphQL服务器,但前提是数据库中的字段为'course',而我的数据库字段为'courseId'
const CourseSchema = new Schema({
_id: { type: String },
sections: [{
type: Schema.Types.String,
ref: 'Section'
}],
});
const SectionType = new GraphQLObjectType({
name: 'SectionType',
fields: () => ({
id: { type: GraphQLID },
courseId: {
type: require('./course_type'),
resolve(parentValue) {
return Section.findById(parentValue)
.populate('course')
.then(section => section.course);
}
},
}),
});
答案 0 :(得分:1)
实际上MongoDB不是一个关系数据库。您可以随意更改字段及其名称。例如,我有一个所有者(Meteor.users)表和带有此列的患者表
ownerid : {type: String, min: 1},
firstname: {type: String, min: 1},
lastname: {type: String, min: 1},
middlename: {type: String, min: 1, optional: true},
createdbyid: { type: String },
createdbyname: { type: String },
createdat: { type: Date, defaultValue: new Date() },
updatedbyid: { type: String, optional: true },
updatedbyname : { type: String, optional: true },
updatedat: { type: Date, defaultValue: new Date() },
我可以轻松地将我的{Meteor.Users()._ id}的值标记为我指定患者的所有者,只需在meteor.methods处理它们。你不必担心外键mongo没有做关系数据库,你可以自定义数据库,无论你喜欢什么。我希望这有帮助;)
答案 1 :(得分:0)
Mongoose Documentation假设_id必须在refs和[i]t is important to match the type of _id to the type of ref.
中使用,例如:
var personSchema = Schema({
_id : Number, //it is `Number`
name : String,
age : Number,
stories : [{ type: Schema.Types.ObjectId, ref: 'Story' }]
});
var storySchema = Schema({
_creator : { type: Number, ref: 'Person' },
title : String,
fans : [{ type: Number, ref: 'Person' }] // use `Number` to match
});
我也想知道是否通过数据库'你的意思是'收集'。
答案 2 :(得分:0)
我明白了!使用最新版本的mongoose,您实际上可以使用虚拟字段来完成我想要做的事情,这种技术可以灵活地布局您的架构。假设我的MongoDB集合如下所示:
setup.py
我可以在mongoose中使用以下架构,它允许我引用Courses { _id, sectionIds }
Lectures { _id, courseId }
或course.lectures
而不是通常的lecture.course
或course.lectureIds
:
section.courseId