无法使用graphQL中的populate获取嵌套的mongoose查询

时间:2017-05-24 03:40:57

标签: node.js mongodb mongoose graphql

我正在使用mongoose连接一个graphQL后端,并且我遇到了嵌套查询的一些mongoose约定的问题。如果我在根查询中有以下字段:

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

此课程类型:

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

我的模型看起来像这样:

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');

我希望我可以运行这样的查询:

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

我应该回顾一下所有部分的特定课程。这些部分以空数组的形式返回,而课程按预期返回。我可以告诉我,如果我在findSections方法中查看它具有正确的id,但populate似乎没有获取这些部分。

我有一种感觉,我遇到了一些问题,因为mongoose如何使用它的惯例来命名,但我不能为我的生活找出正在发生的事情。这是我的mongoDB的样子:

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

1 个答案:

答案 0 :(得分:1)

有些事情看起来并不正确。您想要填充路径部分,但字符串是大写字母。请参阅docu

所以看起来应该是这样的:

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