在 Graphiql 中过滤查询的语法是什么?
Which syntax for filtering queries in Graphiql?
graphql 的新手并开始使用 graphiql。
我有一个产品数据类型
type Product {
_id: String
name: String
price: Float
}
我 mongodb 填充了一些产品
{ "_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 }
在 graphiql 中我可以执行这样的查询
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 比较运算符?
我试过
query {
products(filter:{price: {gt:2.0} }){
name,
price
}
}
但我收到 "filter" 的错误消息:
"Query" 类型的字段 "products" 上的未知参数 "filter"。
我找不到办法做到这一点...
更新
@diego
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]}))
},
},
}
首先您需要更改查询类型定义
products(filter: String): [Product]
现在它接受字符串过滤器,您可以在解析器中使用它
products: async (_, {filter}) => {
const query = JSON.parse(filter)
return (await Products.find(query).toArray()).map(prepare)
}
然后您可以这样调用您的查询:
query {
products(filter: "{\"price\": {\"gt\":2.0} }") {
name,
price
}
}
我不知道是否有办法在不更改查询本身的情况下执行此操作。
graphql 的新手并开始使用 graphiql。 我有一个产品数据类型
type Product {
_id: String
name: String
price: Float
}
我 mongodb 填充了一些产品
{ "_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 }
在 graphiql 中我可以执行这样的查询
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 比较运算符?
我试过
query {
products(filter:{price: {gt:2.0} }){
name,
price
}
}
但我收到 "filter" 的错误消息:
"Query" 类型的字段 "products" 上的未知参数 "filter"。 我找不到办法做到这一点...
更新 @diego
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]}))
},
},
}
首先您需要更改查询类型定义
products(filter: String): [Product]
现在它接受字符串过滤器,您可以在解析器中使用它
products: async (_, {filter}) => {
const query = JSON.parse(filter)
return (await Products.find(query).toArray()).map(prepare)
}
然后您可以这样调用您的查询:
query {
products(filter: "{\"price\": {\"gt\":2.0} }") {
name,
price
}
}
我不知道是否有办法在不更改查询本身的情况下执行此操作。