mongodb – apollostack / graphql-server – 如何从解析器中获取查询中请求的字段

我试图找出一种干净的方式来处理查询和mongdb投影,所以我不必从数据库中检索过多的信息.
假设我有:

// the query
type Query {
  getUserByEmail(email: String!): User
}

我有一个用户的电子邮件和用户名,以保持简单.如果我发送查询而我只想检索电子邮件,我可以执行以下操作:

query { getUserByEmail(email: "test@test.com") { email } }

但是在解析器中,我的数据库查询仍然检索用户名和电子邮件,但只有其中一个由apollo服务器作为查询结果传回.

我只希望数据库检索查询要求的内容:

// the resolver
getUserByEmail(root, args, context, info) {
  // check what fields the query requested
  // create a projection to only request those fields
  return db.collection('users').findOne({ email: args.email }, { /* projection */ });
}

当然问题是,获取客户端请求的信息并不是那么简单.

假设我将请求作为上下文传递 – 我考虑使用context.payload(hapi.js),它具有查询字符串,并通过各种.split()搜索它,但这感觉有点脏.据我所知,info.fieldASTs [0] .selectionSet.selections有字段列表,我可以在那里检查它是否存在.我不确定这是多么可靠.特别是当我开始使用更复杂的查询时.

有更简单的方法吗?

如果您不使用mongDB,则投影是您传递的另一个参数,告诉它明确要检索的内容:

// telling mongoDB to not retrieve _id
db.collection('users').findOne({ email: 'test@test.com' }, { _id: 0 })

一如既往,感谢这个令人惊叹的社区.

最佳答案
你当然可以.这实际上与基于SQL的db的join-monster包实现的功能相同.他们的创作者有一个演讲:https://www.youtube.com/watch?v=Y7AdMIuXOgs

看看他们的信息分析代码,让你开始 – https://github.com/stems/join-monster/blob/master/src/queryASTToSqlAST.js#L6-L30

很想看到一个投影怪物包给我们mongo用户:)

更新:
有一个包从npm:https://www.npmjs.com/package/graphql-mongodb-projection的info创建一个投影对象

转载注明原文:mongodb – apollostack / graphql-server – 如何从解析器中获取查询中请求的字段 - 代码日志