You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GraphQL Schema中定义对象类型?适配MongoDB待办日期对象

问题:MongoDB中对象类型的due_date字段,在GraphQL Schema里该如何正确定义?

我有如下MongoDB待办事项Schema:

const todoSchema = new Schema(
  {
    userId: { type: String, required: true },
    title: { type: String, required: true },
    due_date: {
      date: { type: Number },
      month: { type: Number },
      year: { type: Number },
      hours: { type: Number },
      minute: { type: Number },
    },
    status: { type: String, required: true},
  },
  { timestamps: true }
);

我编写了如下GraphQL Schema:

const Todo = new GraphQLObjectType({
  name: "Todo",
  fields: () => ({
    _id: { type: GraphQLID },
    userId: { type: GraphQLString },
    title: { type: GraphQLString },
    due_date: { type: GraphQLString },
    status: { type: GraphQLString },
  })
});

请问due_date的正确类型是什么?在MongoDB中我将其定义为对象,如何在GraphQL Schema中把due_date定义为对象类型?


解决方案

你不能把due_date定义为GraphQLString,因为它在MongoDB里是包含多个数字字段的对象。正确做法是为due_date单独定义一个GraphQL对象类型,再在Todo类型中引用这个新类型。

步骤1:定义DueDate对象类型

创建对应MongoDB中due_date结构的GraphQL对象类型:

const DueDate = new GraphQLObjectType({
  name: "DueDate",
  fields: () => ({
    date: { type: GraphQLInt },
    month: { type: GraphQLInt },
    year: { type: GraphQLInt },
    hours: { type: GraphQLInt },
    minute: { type: GraphQLInt },
  })
});

这里用GraphQLInt是因为MongoDB里的字段类型为Number,对应GraphQL的整数类型。

步骤2:在Todo类型中引用DueDate

修改Todo类型里的due_date字段,替换为自定义的对象类型:

const Todo = new GraphQLObjectType({
  name: "Todo",
  fields: () => ({
    _id: { type: GraphQLID },
    userId: { type: GraphQLString },
    title: { type: GraphQLString },
    due_date: { type: DueDate }, // 使用自定义对象类型
    status: { type: GraphQLString },
  })
});

额外说明:处理输入场景(创建/更新Todo)

如果需要在GraphQL的输入参数中传递due_date对象,还要定义对应的输入类型(InputType)——普通ObjectType无法用于输入参数:

const DueDateInput = new GraphQLInputObjectType({
  name: "DueDateInput",
  fields: () => ({
    date: { type: GraphQLInt },
    month: { type: GraphQLInt },
    year: { type: GraphQLInt },
    hours: { type: GraphQLInt },
    minute: { type: GraphQLInt },
  })
});

之后在创建或更新Todo的Mutation中,就可以用DueDateInput作为due_date参数的类型。

内容的提问来源于stack exchange,提问作者coderNoob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 02:05:10