Naar de inhoud

TypeScript GraphQL voor MongoDB — Numio

Genereert TypeScript MongoDB-documenttypen op basis van een schema geannoteerd met @entity, @id, @column, @link, @embedded en @map, met behulp van @graphql-codegen/typescript-mongodb. Elk @entity-type krijgt een <Name>DbObject-type; velden zonder richtlijn worden weggelaten.

De opgeslagen MongoDB-documentvorm behouden naast de typen GraphQL API van dezelfde entiteit.

GraphQL Schema

TypeScript MongoDB

Wanneer gebruik je dit?

  • De opgeslagen MongoDB-documentvorm behouden naast de typen GraphQL API van dezelfde entiteit.
  • Zien hoe @map-paden en @link-referenties zich vertalen in geneste objecten en ObjectId-arrays voordat code voor gegevenstoegang wordt geschreven.

Hoe werkt het

  1. Plak een schema waarvan de typen @entity gebruiken en waarvan de velden @id, @column, @link, @embedded of @map(path: ...) gebruiken.
  2. Lees de DbObject-typen aan het einde van de uitvoer; de GraphQL-typen zelf worden erboven gegenereerd.
  3. Kopieer het resultaat naar een .ts-bestand; het importeert ObjectId uit het mongodb-pakket.

GraphQL-schema met MongoDB-richtlijnen

type User @entity {
  id: ID! @id
  email: String! @column @map(path: "login.email")
  profile: Profile! @embedded
  posts: [Post!]! @link
}

type Profile @entity(embedded: true) {
  name: String! @column
}

type Post @entity {
  id: ID! @id
  title: String! @column
}

TypeScript DbObject-typen

…
export type AdditionalEntityFields = {
  path?: InputMaybe<Scalars["String"]["input"]>
  type?: InputMaybe<Scalars["String"]["input"]>
}

import { ObjectId } from "mongodb"
export type UserDbObject = {
  _id: ObjectId
  login: {
    email: string
  }
  profile: ProfileDbObject
  posts: Array<PostDbObject["_id"]>
}

export type ProfileDbObject = {
  name: string
}

export type PostDbObject = {
  _id: ObjectId
  title: string
}

Details en beperkingen

@id wordt _id: ObjectId, @link wordt de _id van de gekoppelde entiteit (Array<PostDbObject["_id"]> voor lijsten) en @map(pad: "login.email") creëert een genest login-object.

Velden zonder richtlijn (geen @column, @id, @link, @embedded) zijn niet opgenomen in het type DbObject; null-kolommen worden optionele Maybe<T>-eigenschappen.

De uitvoer bevat ook de standaard typen typescript-plug-ins (hierboven weggelaten). Het genereren wordt uitgevoerd in een Web Worker in uw browser.

FAQ

Moet ik de richtlijnen @entity en @column in mijn schema declareren?

Nee. De plug-in voegt zijn eigen richtlijndefinities toe, wat ook de reden is dat er een AdditionalEntityFields-invoertype in de uitvoer verschijnt.

Hoe worden ingesloten documenten getypt?

Een type dat is gedeclareerd met @entity(embedded: true) krijgt het type DbObject zonder _id, en een veld gemarkeerd met @embedded verwijst ernaar, bijvoorbeeld profiel: ProfileDbObject.

Waarom ontbreekt een veld in het type DbObject?

Alleen velden met @id, @column, @link, @embedded of @map zijn opgeslagen velden. Voeg @column toe om een ​​gewoon veld op te nemen.

Specificaties en referenties