Mongodb 关系图

Mongodb 关系图,mongodb,mongoose,graphql,mongoose-schema,apollo-server,Mongodb,Mongoose,Graphql,Mongoose Schema,Apollo Server,第二周,我尝试链接apollo server express/MongoDB/Mongoose/GraphQL堆栈中的两个集合,但我不明白如何链接。我在RESTAPI中也学到了类似的一课,我需要的是关系。我需要这个,但是用GraphQL 如何向用户添加汽车? 我收集了测试服务器,代码如下: 帮助尝试在您的汽车分解器中制作类似的内容 export default { getCar: ({ _id: ownId }, { _id }) => Car.findById(ownId

第二周,我尝试链接apollo server express/MongoDB/Mongoose/GraphQL堆栈中的两个集合,但我不明白如何链接。我在RESTAPI中也学到了类似的一课,我需要的是关系。我需要这个,但是用GraphQL

如何向用户添加汽车? 我收集了测试服务器,代码如下:
帮助

尝试在您的汽车分解器中制作类似的内容

export default {
  getCar: ({ _id: ownId }, { _id }) =>
    Car.findById(ownId || _id);
// here is the rest of your code

您需要为用户类型上的
cars
字段添加解析器

const resolvers = {
  Query: {
    getUsers: ...
    getCars: ...
    ...
  },
  Mutation: {
    ...
  },
  User: {
    cars: ...
  }
}

我已经克隆了您的项目并实现了一些代码,这里是我为使关系正常工作所做的更改。注意,我只是在没有验证的情况下编写了一个基本代码,或者为了确保不复杂,我使用了AdvancedDataLoader。希望能有所帮助

src/graphql/resolvers/car resolvers.js

import Car from '../../models/Car'
import User from '../../models/User'

export default {
  getCar: (_, { _id }) => Car.findById(_id),
  getCars: () => Car.find({}),
  getCarsByUser: (user, {}) =>  Car.find({seller: user._id }), // for relationship
  createCar: async (_, args) => {
    // Create new car
    return await Car.create(args) 
  }
}
import User from '../../models/User'

export default { 
  getUser: (_, { _id }) => User.findById(_id),
  getUsers: () => User.find({}),
  getUserByCar: (car, args) => User.findById(car.seller), // for relationship
  createUser: (_, args) => {
    return User.create(args) 
  }
}
import UserResolvers from './user-resolvers'
import CarResolvers from './car-resolvers'

export default {
  User:{
    cars: CarResolvers.getCarsByUser  // tricky part to link query relation ship between User and Car
  },
  Car:{
    seller: UserResolvers.getUserByCar  // tricky part to link query relation ship between User and Car
  },
  Query: {
    getUser: UserResolvers.getUser,
    getUsers: UserResolvers.getUsers,
    getCar: CarResolvers.getCar,
    getCars: CarResolvers.getCars
  },

  Mutation: {
    createUser: UserResolvers.createUser,
    createCar: CarResolvers.createCar,
  }
}
export default`
  type Status {
    message: String!
  }

  type User {
    _id: ID!
    firstName: String
    lastName: String
    email: String
    cars: [Car]
  }

  type Car {
    _id: ID 
    make: String
    model: String
    year: String
    seller: User
  }

  type Query {
    getUser(_id: ID!): User 
    getUsers: [User] 
    getCar(_id: ID!): Car 
    getCars: [Car] 
  }

  type Mutation {
    createUser(firstName: String, lastName: String, email: String): User 
    // change from _id to seller, due to base on logic _id conflict with CarId 
    createCar(seller: ID!, make: String, model: String, year: String): Car 
  }

  schema {
    query: Query
    mutation: Mutation
  }
`
import bodyParser from 'body-parser'
import { graphqlExpress, graphiqlExpress } from 'apollo-server-express'
import { makeExecutableSchema } from 'graphql-tools'

import typeDefs from '../graphql/schema'
import resolvers from '../graphql/resolvers'
import constants from './constants'

export const schema = makeExecutableSchema({
  typeDefs,
  resolvers
})

export default app => {

  app.use('/graphiql', graphiqlExpress({
    endpointURL: constants.GRAPHQL_PATH
  }))

  app.use(
    constants.GRAPHQL_PATH, 
    bodyParser.json(),
    graphqlExpress(req => ({
      schema,
      context: {
        event: req.event
      }
    }))
  )
}
src/graphql/resolvers/user resolvers.js

import Car from '../../models/Car'
import User from '../../models/User'

export default {
  getCar: (_, { _id }) => Car.findById(_id),
  getCars: () => Car.find({}),
  getCarsByUser: (user, {}) =>  Car.find({seller: user._id }), // for relationship
  createCar: async (_, args) => {
    // Create new car
    return await Car.create(args) 
  }
}
import User from '../../models/User'

export default { 
  getUser: (_, { _id }) => User.findById(_id),
  getUsers: () => User.find({}),
  getUserByCar: (car, args) => User.findById(car.seller), // for relationship
  createUser: (_, args) => {
    return User.create(args) 
  }
}
import UserResolvers from './user-resolvers'
import CarResolvers from './car-resolvers'

export default {
  User:{
    cars: CarResolvers.getCarsByUser  // tricky part to link query relation ship between User and Car
  },
  Car:{
    seller: UserResolvers.getUserByCar  // tricky part to link query relation ship between User and Car
  },
  Query: {
    getUser: UserResolvers.getUser,
    getUsers: UserResolvers.getUsers,
    getCar: CarResolvers.getCar,
    getCars: CarResolvers.getCars
  },

  Mutation: {
    createUser: UserResolvers.createUser,
    createCar: CarResolvers.createCar,
  }
}
export default`
  type Status {
    message: String!
  }

  type User {
    _id: ID!
    firstName: String
    lastName: String
    email: String
    cars: [Car]
  }

  type Car {
    _id: ID 
    make: String
    model: String
    year: String
    seller: User
  }

  type Query {
    getUser(_id: ID!): User 
    getUsers: [User] 
    getCar(_id: ID!): Car 
    getCars: [Car] 
  }

  type Mutation {
    createUser(firstName: String, lastName: String, email: String): User 
    // change from _id to seller, due to base on logic _id conflict with CarId 
    createCar(seller: ID!, make: String, model: String, year: String): Car 
  }

  schema {
    query: Query
    mutation: Mutation
  }
`
import bodyParser from 'body-parser'
import { graphqlExpress, graphiqlExpress } from 'apollo-server-express'
import { makeExecutableSchema } from 'graphql-tools'

import typeDefs from '../graphql/schema'
import resolvers from '../graphql/resolvers'
import constants from './constants'

export const schema = makeExecutableSchema({
  typeDefs,
  resolvers
})

export default app => {

  app.use('/graphiql', graphiqlExpress({
    endpointURL: constants.GRAPHQL_PATH
  }))

  app.use(
    constants.GRAPHQL_PATH, 
    bodyParser.json(),
    graphqlExpress(req => ({
      schema,
      context: {
        event: req.event
      }
    }))
  )
}
src/graphql/resolvers/index.js

import Car from '../../models/Car'
import User from '../../models/User'

export default {
  getCar: (_, { _id }) => Car.findById(_id),
  getCars: () => Car.find({}),
  getCarsByUser: (user, {}) =>  Car.find({seller: user._id }), // for relationship
  createCar: async (_, args) => {
    // Create new car
    return await Car.create(args) 
  }
}
import User from '../../models/User'

export default { 
  getUser: (_, { _id }) => User.findById(_id),
  getUsers: () => User.find({}),
  getUserByCar: (car, args) => User.findById(car.seller), // for relationship
  createUser: (_, args) => {
    return User.create(args) 
  }
}
import UserResolvers from './user-resolvers'
import CarResolvers from './car-resolvers'

export default {
  User:{
    cars: CarResolvers.getCarsByUser  // tricky part to link query relation ship between User and Car
  },
  Car:{
    seller: UserResolvers.getUserByCar  // tricky part to link query relation ship between User and Car
  },
  Query: {
    getUser: UserResolvers.getUser,
    getUsers: UserResolvers.getUsers,
    getCar: CarResolvers.getCar,
    getCars: CarResolvers.getCars
  },

  Mutation: {
    createUser: UserResolvers.createUser,
    createCar: CarResolvers.createCar,
  }
}
export default`
  type Status {
    message: String!
  }

  type User {
    _id: ID!
    firstName: String
    lastName: String
    email: String
    cars: [Car]
  }

  type Car {
    _id: ID 
    make: String
    model: String
    year: String
    seller: User
  }

  type Query {
    getUser(_id: ID!): User 
    getUsers: [User] 
    getCar(_id: ID!): Car 
    getCars: [Car] 
  }

  type Mutation {
    createUser(firstName: String, lastName: String, email: String): User 
    // change from _id to seller, due to base on logic _id conflict with CarId 
    createCar(seller: ID!, make: String, model: String, year: String): Car 
  }

  schema {
    query: Query
    mutation: Mutation
  }
`
import bodyParser from 'body-parser'
import { graphqlExpress, graphiqlExpress } from 'apollo-server-express'
import { makeExecutableSchema } from 'graphql-tools'

import typeDefs from '../graphql/schema'
import resolvers from '../graphql/resolvers'
import constants from './constants'

export const schema = makeExecutableSchema({
  typeDefs,
  resolvers
})

export default app => {

  app.use('/graphiql', graphiqlExpress({
    endpointURL: constants.GRAPHQL_PATH
  }))

  app.use(
    constants.GRAPHQL_PATH, 
    bodyParser.json(),
    graphqlExpress(req => ({
      schema,
      context: {
        event: req.event
      }
    }))
  )
}
src/graphql/schema.js

import Car from '../../models/Car'
import User from '../../models/User'

export default {
  getCar: (_, { _id }) => Car.findById(_id),
  getCars: () => Car.find({}),
  getCarsByUser: (user, {}) =>  Car.find({seller: user._id }), // for relationship
  createCar: async (_, args) => {
    // Create new car
    return await Car.create(args) 
  }
}
import User from '../../models/User'

export default { 
  getUser: (_, { _id }) => User.findById(_id),
  getUsers: () => User.find({}),
  getUserByCar: (car, args) => User.findById(car.seller), // for relationship
  createUser: (_, args) => {
    return User.create(args) 
  }
}
import UserResolvers from './user-resolvers'
import CarResolvers from './car-resolvers'

export default {
  User:{
    cars: CarResolvers.getCarsByUser  // tricky part to link query relation ship between User and Car
  },
  Car:{
    seller: UserResolvers.getUserByCar  // tricky part to link query relation ship between User and Car
  },
  Query: {
    getUser: UserResolvers.getUser,
    getUsers: UserResolvers.getUsers,
    getCar: CarResolvers.getCar,
    getCars: CarResolvers.getCars
  },

  Mutation: {
    createUser: UserResolvers.createUser,
    createCar: CarResolvers.createCar,
  }
}
export default`
  type Status {
    message: String!
  }

  type User {
    _id: ID!
    firstName: String
    lastName: String
    email: String
    cars: [Car]
  }

  type Car {
    _id: ID 
    make: String
    model: String
    year: String
    seller: User
  }

  type Query {
    getUser(_id: ID!): User 
    getUsers: [User] 
    getCar(_id: ID!): Car 
    getCars: [Car] 
  }

  type Mutation {
    createUser(firstName: String, lastName: String, email: String): User 
    // change from _id to seller, due to base on logic _id conflict with CarId 
    createCar(seller: ID!, make: String, model: String, year: String): Car 
  }

  schema {
    query: Query
    mutation: Mutation
  }
`
import bodyParser from 'body-parser'
import { graphqlExpress, graphiqlExpress } from 'apollo-server-express'
import { makeExecutableSchema } from 'graphql-tools'

import typeDefs from '../graphql/schema'
import resolvers from '../graphql/resolvers'
import constants from './constants'

export const schema = makeExecutableSchema({
  typeDefs,
  resolvers
})

export default app => {

  app.use('/graphiql', graphiqlExpress({
    endpointURL: constants.GRAPHQL_PATH
  }))

  app.use(
    constants.GRAPHQL_PATH, 
    bodyParser.json(),
    graphqlExpress(req => ({
      schema,
      context: {
        event: req.event
      }
    }))
  )
}
src/middleware.js

import Car from '../../models/Car'
import User from '../../models/User'

export default {
  getCar: (_, { _id }) => Car.findById(_id),
  getCars: () => Car.find({}),
  getCarsByUser: (user, {}) =>  Car.find({seller: user._id }), // for relationship
  createCar: async (_, args) => {
    // Create new car
    return await Car.create(args) 
  }
}
import User from '../../models/User'

export default { 
  getUser: (_, { _id }) => User.findById(_id),
  getUsers: () => User.find({}),
  getUserByCar: (car, args) => User.findById(car.seller), // for relationship
  createUser: (_, args) => {
    return User.create(args) 
  }
}
import UserResolvers from './user-resolvers'
import CarResolvers from './car-resolvers'

export default {
  User:{
    cars: CarResolvers.getCarsByUser  // tricky part to link query relation ship between User and Car
  },
  Car:{
    seller: UserResolvers.getUserByCar  // tricky part to link query relation ship between User and Car
  },
  Query: {
    getUser: UserResolvers.getUser,
    getUsers: UserResolvers.getUsers,
    getCar: CarResolvers.getCar,
    getCars: CarResolvers.getCars
  },

  Mutation: {
    createUser: UserResolvers.createUser,
    createCar: CarResolvers.createCar,
  }
}
export default`
  type Status {
    message: String!
  }

  type User {
    _id: ID!
    firstName: String
    lastName: String
    email: String
    cars: [Car]
  }

  type Car {
    _id: ID 
    make: String
    model: String
    year: String
    seller: User
  }

  type Query {
    getUser(_id: ID!): User 
    getUsers: [User] 
    getCar(_id: ID!): Car 
    getCars: [Car] 
  }

  type Mutation {
    createUser(firstName: String, lastName: String, email: String): User 
    // change from _id to seller, due to base on logic _id conflict with CarId 
    createCar(seller: ID!, make: String, model: String, year: String): Car 
  }

  schema {
    query: Query
    mutation: Mutation
  }
`
import bodyParser from 'body-parser'
import { graphqlExpress, graphiqlExpress } from 'apollo-server-express'
import { makeExecutableSchema } from 'graphql-tools'

import typeDefs from '../graphql/schema'
import resolvers from '../graphql/resolvers'
import constants from './constants'

export const schema = makeExecutableSchema({
  typeDefs,
  resolvers
})

export default app => {

  app.use('/graphiql', graphiqlExpress({
    endpointURL: constants.GRAPHQL_PATH
  }))

  app.use(
    constants.GRAPHQL_PATH, 
    bodyParser.json(),
    graphqlExpress(req => ({
      schema,
      context: {
        event: req.event
      }
    }))
  )
}


非常感谢,表格理解一对多通信,但如何建立多对多连接?