Удалить ссылку (ссылка на Mongoose) [дублировать]

Я попытаюсь объяснить вам, что это за ошибка. Начиная с MySQL 5.7.5, опция ONLY_FULL_GROUP_BY включена по умолчанию. Таким образом, согласно стандарту SQL92 и ранее:

не разрешает запросы, для которых список выбора, условие HAVING или список ORDER BY относятся к неагрегированным столбцам, которые не имеют ни имени в предложении GROUP BY, ни функционально зависимы от (однозначно определенных) столбцами GROUP BY

( подробнее в документах )

Итак, например:

SELECT * FROM `users` GROUP BY `name`;

После выполнения запроса вы получите сообщение об ошибке.

# 1055 - Выражение # 1 списка SELECT не находится в предложении GROUP BY и содержит неагрегированный столбец «testite». user.id ', который функционально не зависит от столбцов в предложении GROUP BY; это несовместимо с sql_mode = only_full_group_by

Почему? Поскольку MySQL точно не понимает, какие определенные значения из сгруппированных записей извлекаются, и это точка.

I.E. скажем, у вас есть эти записи в вашей таблице users:

И вы выполните недопустимый запрос, показанный выше. И вы получите ошибку, показанную выше, потому что есть 3 записи с именем John, и это хорошо, но все они имеют разные значения полей email. Таким образом, MySQL просто не понимает, какие из них возвращаются в результирующую сгруппированную запись.

Вы можете исправить эту проблему, просто изменив свой запрос следующим образом:

SELECT `name` FROM `users` GROUP BY `name`

Также , вы можете захотеть добавить больше полей в секцию SELECT, но вы не можете это сделать, если они не агрегированы, но есть костыль, который вы могли бы использовать (но сильно не рекомендовано):

SELECT ANY_VALUE(`id`), ANY_VALUE(`email`), `name` FROM `users` GROUP BY `name`

Теперь вы можете спросить, почему использование ANY_VALUE настоятельно не рекомендуется? Поскольку MySQL точно не знает, какое значение сгруппированных записей извлекается, и с помощью этой функции вы просите ее получить любую из них (в этом случае было отправлено электронное письмо первой записи с именем = John). Именно я не могу придумать какие-либо идеи о том, почему вы хотите, чтобы это поведение существовало. Пожалуйста, если вы меня не понимаете, читайте больше о том, как работает группировка в MySQL, это очень просто.

И к концу, вот еще один простой, но действительный запрос. Если вы хотите запросить общий подсчет пользователей в соответствии с доступными возрастами, вы можете записать этот запрос

SELECT `age`, COUNT(`age`) FROM `users` GROUP BY `age`;

, который является полностью действительным, в соответствии с правилами MySQL. И так далее. Важно понять, в чем проблема, и только потом записать решение.

33
задан Nick Parsons 16 January 2013 в 01:39
поделиться

3 ответа

Это один из основных вариантов использования промежуточного программного обеспечения Mongoose 'remove' .

clientSchema.pre('remove', function(next) {
    // 'this' is the client being removed. Provide callbacks here if you want
    // to be notified of the calls' result.
    Sweepstakes.remove({client_id: this._id}).exec();
    Submission.remove({client_id: this._id}).exec();
    next();
});

Таким образом, когда вы вызываете client.remove(), это промежуточное программное обеспечение автоматически вызывается очистить зависимости.

85
ответ дан JohnnyHK 28 August 2018 в 08:41
поделиться

Другим способом я нашел

submissionSchema.pre('remove', function(next) {
    this.model('Client').remove({ submission_ids: this._id }, next);
    next();
});
0
ответ дан Sam Bellerose 28 August 2018 в 08:41
поделиться

Если ваши ссылки хранятся иначе, скажем, client имеет массив из submission_ids, то аналогично принятому ответу вы можете определить следующее на submissionSchema:

submissionSchema.pre('remove', function(next) {
    Client.update(
        { submission_ids : this._id}, 
        { $pull: { submission_ids: this._id } },
        { multi: true })  //if reference exists in multiple documents 
    .exec();
    next();
});

, который удалит идентификатор отправки из ссылочных массивов клиентов в submission.remove().

3
ответ дан Talha Awan 28 August 2018 в 08:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: