2017-05-25 30 views
0

mongoose + Node.js/Expressに、外部キーフィールドとモデルのそのフィールドを参照するものとの関係を定義する方法はありますか?私の問題は、外来キーがすべて 'example'ではなく 'exampleId'のようにフォーマットされているmongoデータベースがあることです。私は 'exampleId'を直接呼び出すことができますが、 'example'の代わりに 'exampleId'を設定すると奇妙なことが起こります(一度入力すると、idの代わりに 'example'自体になるので混乱します)。ここでmongooseでdb nameと異なる外部キーの名前を付ける方法

は、私は今それを行うと、それは私のgraphQLサーバでどのように動作するかですが、私のデータベースのフィールドは、「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

私はそれを理解しました。最新のバージョンのmongooseでは、実際にやりたいことを実現するために仮想フィールドを使用することができます。この手法では、スキーマのレイアウトを柔軟に行うことができます。私のMongoDBのコレクションには、以下のように見えると言う:

Courses { _id, sectionIds } 
Lectures { _id, courseId } 

私はマングースに、次のスキーマを使用することができますし、それは私がいつもcourse.lectureIdsまたはsection.courseIdの代わりにcourse.lecturesまたはlecture.courseを参照できるようになります:

const CourseSchema = new Schema({ 
    _id: { type: String }, 
}); 

CourseSchema.virtual('sections', { 
    type: Schema.Types.String, 
    ref: 'Section', 
    localField: 'sectionIds', 
    foreignField: '_id', 
    justOne: false, 
}); 

CourseSchema.statics.findSections = function(id) { 
    return this.findById(id) 
    .populate('sections') 
    .then(course => course.sections); 
} 


const SectionSchema = new Schema({ 
    _id: { type: String }, 
}); 

SectionSchema.virtual('course', { 
    type: Schema.Types.String, 
    ref: 'Course', 
    localField: 'courseId', 
    foreignField: '_id', 
    justOne: true, 
}); 
1

ている間、データベース内の私のフィールドは「当然」である場合にのみ、実際にMongoDBは」にISNリレーショナルデータベース。あなたは好きなようにフィールドとその名前を変更することができます。実施例Iは

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() }, 

私は容易にちょうど処理することによって、私の指定された患者のOWNERIDする私の値{Meteor.Users()._ ID}をスタンプすることができ、このカラムを所有者(Meteor.users)テーブルと患者テーブルを持っていますそれらは流星の方法で。あなたは外部キーを心配する必要はありませんmongoはあなたが好きなものをあなたのデータベースをカスタマイズすることができるリレーショナルデータベースを行いません。私はこの情報がお役に立てば幸いです。)

+0

応答に感謝しますが、これが私の質問に答えるかどうかはわかりません。私はmongoDBとmongoDBをやりとりするためにmongooseパッケージを使用していますが、実際にはうまくいかない値を見つけるためにDBでどのフィールドを見るかについていくつかの前提があります。また、あなたがそこに置いた例であなたのフィールドの価値をどのように変えているのかは分かりません。私は '名前'のようなプロパティや、 'updatedbyid'は実際にはDB内の 'updatedBy'と言うことはできません。 – Coherent

0

Mongoose Documentationは_idは、例えば、参照文献で使用されなければならず、その[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 
}); 

「データベース」で、あなたが「コレクション」を意味している場合、私も疑問に思います。

関連する問題