Max
Max
Eugene
с обновлением хук pre save не работает
Max
Anonymous
посомотри хуки. save, read и т.п.
сейв когда последний раз тыкал сейв, он не работал на апдейты. И рекомендовали костыль. Надо что-то, что работало бы на любое отправление данных в базу...
Max
тогда хз
Max
У меня тоже вопрос по доке:
Setting connectTimeoutMS and socketTimeoutMS to the value 0 has a special meaning. It causes the application to use the operating system’s default socket timeout value.
А когда в этом случае сокет отпадёт? ну чисто в теории? конекшен же не может быть потерян на вечно
Eugene
Eugene
ну только если форкать и патчить под себя
Anonymous
допустим я буду делать сначала find, потом изменять как мне надо, и потом делать .save() , как мне тогда применить $set ?
yopp
Max
Олег
подскажите, как победить ошибку
Mongo Server error (MongoCommandException): Command failed with error 4568 (Location4568): 'Total size of documents in messages matching pipeline { $match: { $and: [ { rateId: { $eq: null } }, {} ] } } exceeds maximum document size' on server localhost:27017.
——
то что тут в ошибке есть часть запроса, по факту в запросе такого нет
Олег
монга 4.0.1
yopp
Олег
yopp
тогда вот так: https://docs.mongodb.com/manual/core/aggregation-pipeline-optimization/#lookup-unwind-coalescence
Олег
yopp
корень вашей проблемы в том, что у вас as получается очень большим
yopp
и документ в пайплайне выпадает за 16мб
yopp
показывайте весь пайплайн, показывайте explain
yopp
что было, что стало
yopp
пример документов тоже
Олег
вот запрос, который еще вчера нормально работал, он не менялся с пол года
db.getCollection("messages").aggregate(
[
{
"$match" : {
"userId" : 13.0,
"sended" : true,
"meta.route" : {
"$ne" : null
},
"$and" : [
{
"created" : {
"$gte" : ISODate("2018-08-01T00:00:00.000+0000")
}
},
{
"created" : {
"$lte" : ISODate("2018-08-31T23:59:59.999+0000")
}
}
]
}
},
{
"$group" : {
"_id" : {
"rateId" : "$meta.ratingInfo._id",
"rateName" : "$meta.ratingInfo.name"
},
"uniqueValues" : {
"$addToSet" : "$meta.ratingInfo._id"
}
}
},
{
"$unwind" : "$uniqueValues"
},
{
"$replaceRoot" : {
"newRoot" : "$_id"
}
},
{
"$lookup" : {
"from" : "messages",
"localField" : "meta.ratingInfo._id",
"foreignField" : "rateId",
"as" : "operators"
}
},
{
"$project" : {
"rateId" : true,
"rateName" : true,
"operators" : {
"$filter" : {
"input" : "$operators",
"as" : "operator",
"cond" : {
"$eq" : [
"$$operator.meta.ratingInfo._id",
"$rateId"
]
}
}
}
}
},
{
"$project" : {
"rateId" : true,
"rateName" : true,
"operators.meta.route.operator._id" : true,
"operators.meta.route.operator.OrgName" : true,
"operators.parts" : true,
"operators.summ" : true,
"operators.mcc" : true,
"operators.channel" : true
}
}
],
{
"allowDiskUse" : false
}
);
Олег
пример результата, к сожалению не смогу показать, из-за ошибки
yopp
"$filter" : {
"input" : "$operators",
"as" : "operator",
"cond" : {
"$eq" : [
"$$operator.meta.ratingInfo._id",
"$rateId"
]
}
}
если я не ошибаюсь, то вы можете это пернести в pipeline внутри $lookup
yopp
но в любом случае, если у вас может быть много документов в $operators вам неизбежно придётся делать $unwind по этому полю
Олег
так проблема в том, что до $filter даже не доходит, все заканчивается на $lookup
yopp
ещё раз: у вас в operators попадает большое число документов и размер записи перешагивает 16мб. Вам необходимо это исправить. У вас есть два варианта: $unwind по operators _сразу_ после $lookup или pipeline внутри $lookup чтоб сразу отфильтровать лишние записи
Олег
yopp
я бы использовал обе опции
Nick
как насчет просто найти тот самый проблемный идшник?
yopp
проблема не в айдишнике, а в запросе
Олег
а еще там проблема в том, что массив operator не так просто вынести, т.к. на уровень выше тоже данные есть
Олег
еще момент
чем можно заменить $filter в pipeline?
yopp
Andrew
Кто-нибудь знает как правильно исключать данные из результата, если в одной коллекции хранится несколько моделей?
Nick
yopp
Куда смотреть?
весь сок справа: выводится результат каждого стейджа в пайплайне
Nick
Это в составе какойто тулзы или сам делал?
yopp
100% NIH, обижаешь!
yopp
будет свой плейграунд, а то для монги ничего приличного вообще нет
Andrew
ребята подскажите пожалуйста можно где поспрашивать не стандартные вопросы по поводу монги? или только к разработчикам библиотек обращаться?
yopp
тут и задавайте
Andrew
тут и задавайте
да я уже неделю вкидываю сюда что-то, и никогда не ответили, вот и спрашиваю мб еще есть чаты по теме
yopp
если в коллекции разные схемы, то добавьте какой-то аттрибут описывающий тип данных, сделайте по нему индекс и добавьте в запрос $eq
Andrew
yopp
а так это бесплатный чат, в котором отвечают когда отвечается
yopp
так ещё есть @ru_dba
Andrew
yopp
@dba_ru значит!
Andrew
yopp
тогда зачем вам нечего исключать же
Max
yopp
NIH? Not invented here!
yopp
yopp
если вы храните разные данные в коллекции, зачем вам что-то исключать при выборке?
yopp
вам надо фильтровать поля при вставке
Andrew
yopp
вы подробно опишите свою проблему, с примерами
yopp
сейчас ничего не понятно
Andrew
вот пример двух аккаунтов из коллекции, как видите они имеют различия
Andrew
Вот так я аккаунт получаю, мне нужно поля удалять из результата, в зависимости от того какой именно тип аккаунта
Andrew
yopp
добавьте проекцию
yopp
https://docs.mongodb.com/manual/tutorial/implement-field-level-redaction/
yopp
на мой взгляд, отвественность за проекции полей лежат на той сущности, которая отвечает за тип
yopp
т.е. если у вас там разные типи, сделайте рефлексию этих типов в виде классов, в классе настройте проекции
Andrew
спасибо, буду читать
yopp
но я не знаю как в ноде с этим
Andrew
есть какойто сокращенный гайд с примерами, где и что применять лучше всего
yopp
в руби очень просто было: наследуемся от основного класса и дальше при получении объектов, они инстанцируются в нужный класс
yopp
точнее в монгоиде
yopp
Andrew
это много)
yopp
раздел с туториалами стоить хоть раз просмотреть
yopp
а вот и не много