Graphql: как объявить встраиваемые данные? - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь встроить некоторые данные в мой тип объекта GraphQL. Я начал со ссылки на AddressType, но, наконец, я не хочу иметь два отдельных документа для Location и Address, потому что Address существует только для одного документа Location.

Я пытался сделать это, но, к сожалению, это не работает. Можете ли вы осветить подход для такого типа встраиваемых данных?

const mongoose = require('mongoose');
const graphql = require('graphql');
const { GraphQLObjectType, GraphQLBoolean ,GraphQLString, GraphQLFloat, GraphQLID, GraphQLList, GraphQLInputObjectType } = graphql;
const ReviewType = require('./review_type');
//const AddressType = require('./address_type')
const Location = mongoose.model('location')

const LocationType = new GraphQLObjectType({
  name: 'LocationType',
  fields: () => ({
    id: { type: GraphQLID },
    category: { type: GraphQLString },
    comment: { type: GraphQLString },
    averageReview: { type: GraphQLFloat },
    lat: { type: GraphQLFloat },
    long: { type: GraphQLFloat },
    validated: { type: GraphQLBoolean },
    address: {
      street: { type: GraphQLString },
      number: { type: GraphQLFloat },
      postalCode: { type: GraphQLFloat },
      city: { type: GraphQLString },
      country: { type: GraphQLString }
    },
    /* USED THIS BEFORE
    address: {
      type: require('./address_type'),
      resolve(parentValue) {
        return Location.findById(parentValue.id).populate('address').then(location => {
          return location.address
        })
      }
    }
    */
    reviews: {
      type: new GraphQLList(ReviewType),
      resolve(parentValue){
        return Location.findReviews(parentValue.id)
      }
    }
  })
})

module.exports = LocationType
const mongoose = require('mongoose')
const Schema = mongoose.Schema

const LocationSchema = new Schema({
  category: { type: String },
  comment: { type: String },
  averageReview: { type: Number },
  lat: { type: Number },
  long: { type: Number },
  validated: { type: Boolean },
  address: {
    street: { type: String },
    number: { type: Number },
    postalCode: { type: Number },
    city: { type: String },
    country: { type: String }
  },
  reviews: [{
    type: Schema.Types.ObjectId,
    ref: 'review'
  }]
})

LocationSchema.statics.addReview = function(locationId, content) {
  const Review = mongoose.model('review')
  const Location = mongoose.model('location')

  return this.findById(locationId).then(location => {
    const review = new Review( {content, location})
    location.reviews.push(review)
    const updateLocation = Location.findOneAndUpdate({_id: location._id},{reviews: location.reviews})
    return Promise.all([review.save(), updateLocation])
      .then(([review, location]) => location)
  })
}

LocationSchema.statics.findReviews = function(id) {
  return  this.findById(id).populate('reviews').then(location => location.reviews)
}

I, за исключением возможности встраивать данные без использования другого документа

...