Я пытаюсь встроить некоторые данные в мой тип объекта 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, за исключением возможности встраивать данные без использования другого документа