Graphql 初体验 第五章 | #7 Dynamic Relations

对应内容:#7 Dynamic Relations | Build a Complete App with GraphQL, Node.js, MongoDB and React.js

1 想要查询event的同时获得对应的用户Id?

query {
  events {
    title
    creator {
      _id
      email
    }
  }
}

先修改Schema内容,添加最后两行使得可以在获取一方的同时获取对应的另外一方:

type Event {
    _id: ID!
    title: String!
    description: String!
    price: Float!
    date: String!
    +>creator: User
}

type User {
    _id: ID!
    email: String!
    password: String
    +>createEvents: [Event!]
}

但是这里要注意,以 EventModel 举例,数据库里存的一直是外键——user的Id,从来没有存储整个User。

所以这样是可以的
query {
  events {
    title
    creator {
      _id
    }
  }
}
这样是不行的
query {
  events {
    title
    creator {
      email
    }
  }
}

所以要靠一些方法来进行join。比如 populate 方法。

events: () => {
    return Event.find()
        .populate("creator")
        .then(events => {
        return events.map(event => {
            return {
                ...event._doc,
                date: event.date.toISOString(),
                creator: {
                    // 省略一些系统内建字段,比如_v
                    ...event.creator._doc,
                    password: null
                }
            };
        })
    }).catch(err => {
        throw err
    });
},

这里采用的是populate(Web 填入;填充)方法。上面采用event的"creator"字段作为populate的参数作为字符串传入,通过"creator"字段中的ref属性,来获取对应的user对象,并自动加入到event对象中。最终结果如下,成功。

在新版的graphQL中,不需要再对_id 进行重写覆盖了,但是date还是需要

{
  "data": {
    "events": [
      {
        "title": "test title",
        "creator": {
          "_id": "604482754c6bd70d2453f3e0",
          "email": "787552171@qq.com"
        }
      }
    ]
  }
}

如果想继续嵌套获得呢?

query {
  events {
    title
    creator {
      _id
      email
      createEvents {
        title
      }
    }
  }
}
events: () => {
    return Event.find()
        .then(events => {
        return events.map(event => {
            return {
                ...event._doc,
                date: event.date.toISOString(),
                creator: getUserById(event.creator)
            };
        })
    }).catch(err => {
        throw err
    });
},
上一篇:python – 在GraphQL中检索对象ID


下一篇:边学边做,简单的 GraphQL 实例