发布
社区首页 >问答首页 >Graphiql中过滤查询的语法是什么?

Graphiql中过滤查询的语法是什么?
EN

Stack Overflow用户
提问于 2018-01-19 11:34:58
回答 1查看 18.1K关注 0票数 10

新的图形to,并开始玩石墨化。我有一个产品数据类型

代码语言:javascript
代码运行次数:0
复制
  type Product {
    _id: String
    name: String
    price: Float
  }

我用一些产品填充了mongodb

代码语言:javascript
代码运行次数:0
复制
{ "_id" : ObjectId("5a61b31e009c0bef5d724a47"), "name" : "GROUND COFFEE", "price" : 3.06 }
{ "_id" : ObjectId("5a61b31e009c0bef5d724a48"), "name" : "PORK SAUSAGES 500g",  "price" : 4.39 }
{ "_id" : ObjectId("5a61b31e009c0bef5d724a49"), "name" : "MILK UHT 1LT", "price" : 1.29 }
{ "_id" : ObjectId("5a61b31e009c0bef5d724a4a"), "name" : "HEINEKEN PREMIUM LIGHT 33CL", "price" : 1.61 }

在石墨库中,我可以执行这样的查询

代码语言:javascript
代码运行次数:0
复制
query {
  products{
     name,
    price
  }
}

Query result is

{
  "data": {
    "products": [
      { "name" : "GROUND COFFEE", "price" : 3.06 },
      { "name" : "PORK SAUSAGES 500g",  "price" : 4.39  },
      { "name" : "MILK UHT 1LT", "price" : 1.29 },
      { "name" : "HEINEKEN PREMIUM LIGHT 33CL", "price" : 1.61 }
    ]
  }
}

哇,那很好。所以下一步是:现在我只想要价格大于2.0的产品,我面临两个问题,我不知道如何解决

1)实现过滤的正确语法是哪一种?

2)如何指定比较运算符?以及该规范如何映射到mongodb比较运算符?

我试过

代码语言:javascript
代码运行次数:0
复制
query {
  products(filter:{price: {gt:2.0} }){
     name,
    price
  }
}

但是我得到了一个“过滤器”错误:

未知参数“筛选”字段“产品”的类型“查询”。我没办法这么做..。

更新 @diego

代码语言:javascript
代码运行次数:0
复制
const typeDefs = [`
  type Query {
    product(_id: String): Product
    products: [Product]
  }

  type Product {
    _id: String
    name: String
    price: Float
  }

  type Mutation {
    createProduct(name: String, price: Float): Product
  }

  schema {
    query: Query
    mutation: Mutation
  }
`];

const resolvers = {
  Query: {
    product: async (root, {_id}) => {
      return prepare(await Products.findOne(ObjectId(_id)))
    },
    products: async () => {
      return (await Products.find({}).toArray()).map(prepare)
    },
  },
  Mutation: {
    createProduct: async (root, args, context, info) => {
      const res = await Products.insert(args)
      return prepare(await Products.findOne({_id: res.insertedIds[1]}))
    },
  },
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-19 13:16:05

首先,需要更改查询类型定义。

代码语言:javascript
代码运行次数:0
复制
products(filter: String): [Product]

现在它接受一个字符串筛选器,您可以在解析器中使用它。

代码语言:javascript
代码运行次数:0
复制
products: async (_, {filter}) => {
  const query = JSON.parse(filter)
  return (await Products.find(query).toArray()).map(prepare)
}

然后,您可以调用您的查询如下:

代码语言:javascript
代码运行次数:0
复制
query {
  products(filter: "{\"price\": {\"gt\":2.0} }") {
    name,
    price
  }
}

我不知道在不改变查询本身的情况下是否有办法做到这一点。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48340191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档