如何在GraphQL解析器中动态访问正在查询的字段的名称?

时间:2018-09-19 09:04:34

标签: graphql

我有两个收藏夹:

dbPosts

id: mongoose.Schema.Types.ObjectId,
title: { type: String },
content: { type: String },
excerpt: { type: String },
slug: { type: String },
author: {
   id: { type: String },
   fname: { type: String },
   lname: { type: String },
}

dbAuthors

id: mongoose.Schema.Types.ObjectId,
fname: { type: String },
lname: { type: String },
posts: [
         id: { type: String },
         title: { type: String }
       ]

我按以下方式解决我的作者查询:

Query: {
    authors: (parent, root, args, context) => {
      return dbAuthor.find({});
    },
    author: (root, args, context) => {
      return dbAuthor.findById(args.id);
    },
  },

  Author: {
    posts: (parent) => {
      if(parent.posts) {
        return parent.posts;
      } else {
        return dbAuthor.find({'author.id': parent.id});
      }
    },
  }

我要解决的原因是通过规范化我的关系来优化我的MongoDB请求。这是目标:

如果仅需要列出具有其作品标题的作者,则所有必需的字段都在dbAuthors中,因此无需查找dbPosts。但是,如果您需要返回的每条帖子的更多详细信息,例如节选或,请在dbPosts中查找以下情况:

{'author.id': parent.id}

但是问题是,如果您的查询如下所示:

authors(id: "3") {
  fname
  lname
  posts {
    title
    excerpt
  }
}

它中断了,因为父对象中没有返回excerpt字段。如果可以通过某种方式确定正在作者字段中查询哪些字段,然后确定在父级中返回的值是否足够,则可以轻松解决此问题。如果不是,那么我可以继续使用作者的id值查找dbPosts。可能吗?因为否则,Mongo会强烈敦促您这样做,这将破坏使收藏集不规范化的整个目的!

1 个答案:

答案 0 :(得分:1)

相当不规范-数据已重复;)

您可能正在寻找info.fieldNodes