У меня есть агрегатная функция, которая возвращает людей в коллекции:
const getById = ({ id }) => {
return Project.aggregate([
{ $match: { _id: Types.ObjectId(id) } },
{
$lookup: {
from: "members",
localField: "_id",
foreignField: "project_id",
as: "members"
}
},
])
.then(data => {
const [project] = data;
console.log(project) // see below
return {
id: project._id,
...project
};
})
.catch(err => console.log(err));
}
Если я возвращаю данные из этого, я получаю следующее:
// Server response
{ _id: 5e2f57b577a8ce59c79e74af,
title: 'ok',
user_id: 5e2dc7961e6b840c315b5a03,
__v: 0,
members:
[ { _id: 5e447683b4f732cc9c4a9531,
name: 'Karl Taylor',
email: 'karl@queuey.dev',
project_id: 5e2f57b577a8ce59c79e74af,
position: 1,
__v: 0 },
{ _id: 5e45be128ed96a5eaef5d13e,
name: 'John Smith',
email: 'john@queuey.dev',
project_id: 5e2f57b577a8ce59c79e74af,
position: 2,
__v: 0 } ] }
Однако, когда я запрашиваю из внешнего интерфейса, использующего Apollo GraphQL, идентификатор равен нулю. (Но он работает с другими элементами, так как id
является геттером для id
, но этого не происходит с агрегатными функциями).
Как лучше всего сопоставить id
с правильным значением ? Я обычно просто использовал бы array.map
, но я чувствую, что это может быть излишним, если у меня слишком много участников (в этот момент я, вероятно, разберусь с этим, чтобы сделать нумерацию страниц, но это другая история). Это ответ от внешнего интерфейса
// Client response
"project": {
"id": "5e2f57b577a8ce59c79e74af",
"title": "ok",
"members": [
{
"id": null, // <-- Notice here is null
"name": "Karl Taylor",
"email": "karl@queuey.dev",
"__typename": "Member"
},
{
"id": null, // <-- Notice here is null
"name": "John Smith",
"email": "john@queuey.dev",
"__typename": "Member"
}
],
"__typename": "Project"
}
Этот вопрос здесь похож, но я не считаю, что это дубликат, потому что мы запрашиваем разные данные. (ответ не решает мой вопрос.)
Мне нужно иметь возможность вернуть id
, в противном случае кэшированные перенаправления не будут работать.