Tuesday 23 May 2017

Can't fetch nested mongoose queries using populate in graphQL

I'm wiring up a graphQL backend with mongoose and I am having trouble with some of the conventions of mongoose for a nested query. If I have the following field in the root query:

course: {
  type: CourseType,
  args: { id: { type: new GraphQLNonNull(GraphQLID) } },
  resolve(parentValue, { id }) {
    return Course.findById(id);
  },
},

a Course Type of this:

const CourseType = new GraphQLObjectType({
  name: 'CourseType',
  fields: () => ({
    id: { type: GraphQLID },
    sections: {
      type: new GraphQLList(SectionType),
      resolve(parentValue) {
        return Course.findSections(parentValue._id);
      }
    }
  }),
});

And my model looks like this:

const CourseSchema = new Schema({
  _id: { type: String },
  sections: [{
    type: Schema.Types.String,
    ref: 'Section'
  }],
});

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

mongoose.model('Course', CourseSchema, 'Courses');

const SectionSchema = new Schema({
  _id: { type: String },
  course: {
    type: Schema.Types.String,
    ref: 'Course',
  },
});

mongoose.model('Section', SectionSchema, 'Sections');

I would expect that I could run a query like this:

query {
 course(id: "4Zpm8zrZYqdbr2i4t") {
  id
  sections {
    id
  }
 }
}

and I should get back a given course with all of its sections. The sections comes back as an empty array while the course comes back as expected. I can tell that if I look in the findSections method that it has the proper id, but populate doesn't seem to fetch the sections.

I have a feeling that I am running into some issue with how mongoose uses its conventions for how to name stuff but I can't for the life of me figure out what is going on. Here is what my mongoDB looks like:

MongoDB: Courses: { _id: "4Zpm8zrZYqdbr2i4t" } Sections: { _id: "00000000000000000", courseId: "4Zpm8zrZYqdbr2i4t" }



via Coherent

No comments:

Post a Comment