【问题标题】:How to return id with Mongoose Aggregate Lookup with Apollo GraphQL如何使用 Apollo GraphQL 使用 Mongoose 聚合查找返回 id
【发布时间】:2020-06-06 18:27:23
【问题描述】:

我有一个聚合函数,可以返回集合中的人:

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 为空。 (但它适用于其他项目,因为 idid 的吸气剂,但这不会发生在聚合函数上)。

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"
    }

这个问题here 是类似的,但是,我不认为它是重复的,因为我们正在查询不同的数据。 (答案并没有解决我的问题。)

我需要能够返回 id 否则缓存的重定向将不起作用。

【问题讨论】:

  • 您的字段名为 id,但 MongoDB 返回一个 _id
  • 谢谢丹尼尔,实际上我之前已经评论过这个问题。但它没有回答我的问题。我没有与解析器有关的问题。我遇到了需要解决的嵌套数据问题。谢谢
  • 问题是您缺少解析器。如果您的数据源返回foo,并且您的字段名为bar,则需要告诉GraphQL 在解析bar 时使用foo 的值。 Mongoose has a virtual getter for id 使用 _id 的值,因此您可能并不总是遇到此问题。但是当你使用聚合时,返回的对象是not instances of your model classes,所以没有getter。

标签: reactjs mongoose apollo-client apollo-server


【解决方案1】:

我在尝试使用聚合时也遇到了这个问题。 只是你可以同时拥有 ID(id_id),但这不是一件好事。

我用的是迭代数据

如果查询返回的数据不是数组就用这个

return {
    ...res._doc,
    id: res._id,
}

但返回的数据是一个数组,您可以使用forEachid 添加到响应变量中,如下所示

res.forEach(element => {
     element.id = element._id 
});
return res;

【讨论】:

    猜你喜欢
    • 2020-01-29
    • 2023-03-13
    • 2020-05-19
    • 1970-01-01
    • 2017-07-12
    • 2018-04-04
    • 2020-10-01
    • 1970-01-01
    • 2019-06-10
    相关资源
    最近更新 更多