जो का जवाब ({"name":"ratio" , value:data.active/data.total}
जोड़ें परिणाम के लिए एक बार डेटाबेस से परिणाम प्राप्त होने के बाद) बिना किसी स्कीमा परिवर्तन के इसे करेंगे।
एक वैकल्पिक विधि के रूप में या ग्राफ़क्यूएल में इसे करने के लिए एक अधिक सुरुचिपूर्ण तरीके के रूप में, फ़ील्ड नामों को तर्क के रूप में पारित करने के बजाय प्रकार में ही निर्दिष्ट किया जा सकता है। और ratio
की गणना करें रिज़ॉल्वर लिखकर।
तो, ग्राफक्यूएल स्कीमा होगा:
Item {
total: Int,
active: Int,
ratio: Float
}
type Query {
items: [Item]
}
क्लाइंट फ़ील्ड निर्दिष्ट करता है:
{
items {
total
active
ratio
}
}
और ratio
रिज़ॉल्वर के अंदर गणना की जा सकती है।
यहाँ कोड है:
const express = require('express');
const graphqlHTTP = require('express-graphql');
const { graphql } = require('graphql');
const { makeExecutableSchema } = require('graphql-tools');
const getFieldNames = require('graphql-list-fields');
const typeDefs = `
type Item {
total: Int,
active: Int,
ratio: Float
}
type Query {
items: [Item]
}
`;
const resolvers = {
Query: {
items(obj, args, context, info) {
const fields = getFieldNames(info) // get the array of field names specified by the client
return context.db.getItems(fields)
}
},
Item: {
ratio: (obj) => obj.active / obj.total // resolver for finding ratio
}
};
const schema = makeExecutableSchema({ typeDefs, resolvers });
const db = {
getItems: (fields) => // table.select(fields)
[{total: 10, active: 5},{total: 5, active: 5},{total: 15, active: 5}] // dummy data
}
graphql(
schema,
`query{
items{
total,
active,
ratio
}
}`,
{}, // rootValue
{ db } // context
).then(data => console.log(JSON.stringify(data)))