Я тестирую базовую функцию агрегирования, используя счетчики из Sequelize, и вот мой тип Подсчитывает:
type Creserve {
id: ID!
rDateStart: Date!
rDateEnd: Date!
grade: Int!
section: String!
currentStatus: String!
user: User!
cartlab: Cartlab!
}
type Counts {
section: String!
count: Int
}
type Query {
getBooking(id: ID!): Creserve!
allBookings: [Creserve]
getBookingByUser(userId: ID): Creserve
upcomingBookings: [Creserve]
countBookings: [Counts]
}
Я использую countBookings в качестве запроса для агрегатных функций, а вот мой преобразователь для запроса:
countBookings: async (parent, args, {models}) =>
{
const res = await models.Creserve.findAndCountAll({
group: 'section',
attributes: ['section', [Sequelize.fn('COUNT', 'section'), 'count']]
});
return res.rows;
},
Он выводит следующий запрос:
Executing (default): SELECT "section", COUNT('section') AS "count" FROM "Creserve" AS "Creserve" GROUP BY "section";
И попробовал этот запрос в моей оболочке psql, и он отлично работает:
section | count
---------+-------
A | 2
R | 2
Однако, когда я попытался запросить countBookings на своей игровой площадке GraphQL, возвращается секция, но не счетчик:
{
"data": {
"countBookings": [
{
"section": "A",
"count": null
},
{
"section": "R",
"count": null
}
]
}
}
Я что-то упустил? Или это ошибка? Это ответ, которому я пытался следовать в этом примере: https://stackoverflow.com/a/45586121/9760036
Большое спасибо!
edit: возврат console.info (res.rows) выводит что-то вроде этого:
[ Creserve {
dataValues: { section: 'A', count: '2' },
_previousDataValues: { section: 'A', count: '2' },
_changed: {},
_modelOptions:
{ timestamps: true,
validate: {},
freezeTableName: true,
underscored: false,
underscoredAll: false,
paranoid: false,
rejectOnEmpty: false,
whereCollection: null,
schema: null,
schemaDelimiter: '',
defaultScope: {},
scopes: [],
indexes: [],
name: [Object],
omitNull: false,
hooks: [Object],
sequelize: [Sequelize],
uniqueKeys: {} },
_options:
{ isNewRecord: false,
_schema: null,
_schemaDelimiter: '',
raw: true,
attributes: [Array] },
__eagerlyLoadedAssociations: [],
isNewRecord: false },
Creserve {
dataValues: { section: 'R', count: '2' },
_previousDataValues: { section: 'R', count: '2' },
_changed: {},
_modelOptions:
{ timestamps: true,
validate: {},
freezeTableName: true,
underscored: false,
underscoredAll: false,
paranoid: false,
rejectOnEmpty: false,
whereCollection: null,
schema: null,
schemaDelimiter: '',
defaultScope: {},
scopes: [],
indexes: [],
name: [Object],
omitNull: false,
hooks: [Object],
sequelize: [Sequelize],
uniqueKeys: {} },
_options:
{ isNewRecord: false,
_schema: null,
_schemaDelimiter: '',
raw: true,
attributes: [Array] },
__eagerlyLoadedAssociations: [],
isNewRecord: false } ]
Вот для res.count:
Executing (default): SELECT "section", COUNT('section') AS "count" FROM "Creserve" AS "Creserve" GROUP BY "section";
[ { count: '2' }, { count: '2' } ]





Проблема
На самом деле вы все делаете прямо здесь ... но здесь происходит то, что sequlize не возвращает простой объект ... Он всегда возвращает данные в форме instance, как это
[ Creserve {
dataValues: { section: 'A', count: '2' },
_previousDataValues: { section: 'A', count: '2' },
_changed: {},
_modelOptions:
{ timestamps: true,
Решение
I am not sure but there is no other way instead of looping and makes response to json object...
const array = []
res.rows.map((data) => {
array.push(data.toJSON())
})
return array
Там. Завершил ответ. Поля в res.rows находятся внутри DataValues.
Вот результат: Выполнение (по умолчанию): SELECT "section", COUNT ('section') AS "count" FROM "Creserve" AS "Creserve" GROUP BY "section"; {раздел: 'A', количество: '2'}
Привет, я попробовал, и площадка прочитала ответ. Есть ли способ добавить объекты в массив из этого ответа? Или преобразовать в массив? `` `const array = [{раздел:" A ", count: 2}, {section:" R ", count: 2}]; `` `response:" data ": {" countBookings ": [{" section ":" A "," count ":" 2 "}, {" section ":" R "," count ":" 2 "} ]}}
Да, этот ответ пришел с GraphQL Playground, поэтому он прочитал массив, который вы дали. И я обнаружил, что выполнение findAndCountAll с последующим подсчетом функций в атрибутах уже является избыточным, поэтому он выполняет подсчет как в res.rows, так и в res.count.
{ const array = []; const res = await models.Creserve.findAndCountAll({ group: 'section', attributes: ['section', [Sequelize.fn('COUNT', 'section'), 'count']] }).then(response => { return array.push(response.rows[0].toJSON()); }) } Итак, я протестировал, как преобразовать ответ в массив, и я знаю, что это немного запутанный код, но я просто сделаю forEach позже, но да, думаю. Спасибо. Есть ли у вас какие-либо предложения, как сделать это более эффективным?
Круто, это лучше, чем цикл for, который я сейчас использую. Большое спасибо
Я добавил console.info для res.rows и res.count, и он, кажется, выводит информацию о том, как я хотел, чтобы я его изменил. Как вернуть оба? Извините, я новичок в javascript, я все еще изучаю. И оба счетчика возвращают строку, а не целое число.