MongoDB、GraphQL 和 ISODate 类型

Fre*_*iot 3 mongodb graphql

我有关于 MongoDB ISODate 类型和 GraphQL 的问题。我需要mutation在我的 gql 架构中声明一个允许在我的 Mongo 数据库中添加文档的文件。

该文档具有 ISODate 属性,但在我的 gql 架构中,我使用的是String

mutation addSomething(data: SomeInput)

type SomeInput {
    field1: String
    field2: Int
    created: String
}

Run Code Online (Sandbox Code Playgroud)

我的问题是,在新文档中,该created字段采用字符串格式(不是 ISODate),而我对此是期望的。但我想知道如何让它插入 ISODate。我可以在某个地方使用“自定义类型”来代替 String 吗?

谢谢

PS:我正在使用nodeJS和apollo库。

编辑 1:尝试使用 graphql-iso-date 包

我发现这个包https://www.npmjs.com/package/graphql-iso-date添加了 3 个日期自定义类型。

这是我的 gql 架构:

const { gql } = require('apollo-server');
const { GraphQLDateTime } = require('graphql-iso-date')

const typeDefs = gql`

scalar GraphQLDateTime

type Resto {
    restaurant_id: ID!
    borough: String
    cuisine: String
    name: String
    address: Address
    grades: [Grade]
}

type Address {
    building: String
    street: String
    zipcode: String
    coord: [Float]
}

type Grade {
    date: GraphQLDateTime
    grade: String
    score: Int
}

input GradeInput {
    date: GraphQLDateTime
    grade: String
    score: Int
}

extend type Query {
    GetRestos: [Resto]
    GetRestoById(id: ID!): Resto
}

extend type Mutation {
    UpdateGradeById(grade: GradeInput!, id: ID!): Resto
    RemoveGradeByIdAndDate(date: String, id: ID!): Resto
}

`

module.exports = typeDefs;
Run Code Online (Sandbox Code Playgroud)

这是基于样本餐馆数据集的测试。

UpdateGradeById()所以,如果我尝试像这样调用该函数:

UpdateGradeById(grade:{date:"2020-08-25T08:00:00.000Z",grade:"D",score:15},id:"30075445"){...}
Run Code Online (Sandbox Code Playgroud)

该文档已更新,但日期始终采用字符串格式(如下面的屏幕截图所示):

在此输入图像描述

列表中最后一个成绩的日期被识别为字符串(而不是日期)。

不过,我可以看到改进,因为在使用之前,graphql-iso-date日期字段以时间戳格式返回。现在它们以 ISO 字符串的形式返回。但插入并没有按预期工作。

Fre*_*iot 5

好吧,我在前面的示例中错过了做一些重要的事情:解析器。所以,如果像我一样你想通过 GraphQL 操作 MongoDB 日期类型,你可以使用graphql-iso-date这样的包:

首先,通过添加新标量来修改您的架构:

const { gql } = require('apollo-server');

const typeDefs = gql`

scalar ISODate

type Resto {
    restaurant_id: ID!
    borough: String
    cuisine: String
    name: String
    address: Address
    grades: [Grade]
}

type Address {
    building: String
    street: String
    zipcode: String
    coord: [Float]
}

type Grade {
    date: ISODate
    grade: String
    score: Int
}

input GradeInput {
    date: ISODate
    grade: String
    score: Int
}

extend type Query {
    GetRestos: [Resto]
    GetRestoById(id: ID!): Resto
}

extend type Mutation {
    UpdateGradeById(grade: GradeInput!, id: ID!): Resto
    RemoveGradeByIdAndDate(date: ISODate!, id: ID!): Resto
}

`

module.exports = typeDefs;
Run Code Online (Sandbox Code Playgroud)

(这里我选择调用我的自定义日期标量ISODate

然后,您必须告诉如何通过修改解析器文件来“解析”这个新的 ISODate 标量:

const { GraphQLDateTime } = require('graphql-iso-date')

module.exports = {
    Query: { 
        GetRestos: (_, __, { dataSources }) =>
            dataSources.RestoAPI.getRestos(),

        GetRestoById: (_, {id}, { dataSources }) =>
            dataSources.RestoAPI.getRestoById(id),

    },
    Mutation: {
        UpdateGradeById: (_, {grade,id}, { dataSources }) =>
            dataSources.RestoAPI.updateGradeById(grade,id),

        RemoveGradeByIdAndDate: (_, {date,id}, { dataSources }) =>
            dataSources.RestoAPI.removeGradeByIdAndDate(date,id),
        
    },
    ISODate: GraphQLDateTime

  };
Run Code Online (Sandbox Code Playgroud)

就是这样。现在,我的 mongodb 文档中的日期属性被很好地识别为日期类型值。

在此输入图像描述