Проблема заключается в том, как вы устанавливаете атрибут службы при создании и обновлении человека.Для вложенных типов вы хотите передать объект, содержащий подтипы.Прямо сейчас вы передаете ему просто строку, поэтому, когда вы пытаетесь установить Service равным args.serviceId в вашем преобразователе createPerson, он не существует, и поэтому устанавливает значение этого поля в NULL в MongoDB.Рефакторинг, например, так:
In index.js
type Mutation {
createPerson(Xid: String!, firstName: String */ ... */ service: { id: ID!, name: String!, location: String! }): People!
}
In /resolvers/Mutation.js
const Mutations = {
createPerson: async (parent, args) => {
const newPerson = new People({
Xid: args.Xid,
firstName: args.firstName
/* and so on... */
Service: args.service.id
});
}
}
Кроме того, вы можете столкнуться с проблемами в будущем, учитывая способ сохранения объекта Service в MongoDB в качестве службы с прописной буквой «S», тогда как ваша переменная в запросах - это служба с строчными буквами «s».Вам нужно будет помнить каждый раз, когда вы будете искать в базе данных, чтобы теперь непосредственно деструктурировать args.service в ваш метод Model.find ({service}).Вроде нишевая проблема, но я сам столкнулся с этой проблемой, так что подумал, что упомяну ее.
Отредактировано в ответ на комментарий OP
Да, это такМожно выполнить операцию соединения SQL-соединения, чтобы вернуть объект Service с запросом Person, но вам нужно сделать это в обработчике запросов и просто сохранить идентификатор Service во время мутации.В этом случае, я думаю, причина, по которой он нулевой, заключается в том, что вы вызываете args.serviceId
, но параметр createPerson () просто "service", поэтому попробуйте изменить Mutation.js на Service: args.service
.
Что касается фактической операции соединения,это немного сложнее.Я бы порекомендовал сначала вернуть строку serviceId, чтобы убедиться, что она работает правильно.Затем вам нужно углубиться в конвейер агрегации MongoDB .В частности, оператор конвейера поиска $ выполняет функцию, подобную соединению SQL.Я в конечном итоге бью себя головой о стену каждый раз, когда мне приходится сталкиваться с трубопроводами агрегации.Это довольно сложная тема с запутанным синтаксисом IMO.Но есть множество учебных пособий и примеров для того, чтобы делать именно то, что вы хотите.