Alexey
Так что пусть все встанет раком
Alexey
И я спокойно откачусь на обычную реплику или буду делать схему на 9 серверах
yopp
Это легко решается, за 129€ в час
yopp
Я перестаю быть буквами в интернете и становлюсь вашим консультантом :)
Gleb
очень доходчиво на самом деле все, у нас долго ребята от самих себя фейспалмили после тех двух дней
Alexey
Ну или вообще скажу, чтобы ебались с этой монгой без меня. Я не админ и не дата саентист. Я обычный бэкендщик. Все, что сложнее CreateDataBase() - не ко мне
Anton.
Ребят нужна хелпа фронтендщику (не бейте тапками). Решил Монгу выучить и вот щас пытаюсь понять $near geometry. В общем. При поиске людей вокруг определенной точки, при расстоянии более 19500 метров сервер крашится
Anton.
Сам запрос такого вида ``collection.find( { loc : { $near : { $geometry : { type : "Point" , coordinates : [20.33, 40.527] }, $maxDistance : limit } } } )``
Anton.
yopp
В логах самой монги, не вашего приложения
Anton.
Оуф, секунду поищу
Anton.
В логах самой монги, не вашего приложения
Залил в txt, тут только последний, провальный запрос
yopp
А сервер точно крешится?
yopp
https://github.com/mongodb/node-mongodb-native/blob/master/lib/core/sdam/server.js#L327 проверьте что у вас нет кода, который может закрывать соединение с сервером
yopp
судя по логам это не монга, это клиент отключается
Anton.
А сервер точно крешится?
Нуу, так мне пишет node.js ``MongoError: server is closed`` Что удивительно, на 19500 метрах от точки все работает нормально, но при большей происходит краш.
yopp
В драйвере очень плохие сообщения об ошибке. Судя по коду, имеется ввиду что это статус содеинения с сервером.
yopp
Т.е. у вас закрывается соденинеие, по этому курсор не может сделать getMore
Anton.
То есть проблема скорее всего с node js, насколько я понял ?
yopp
Да. Посмотрите нет ли у вас кода который может закрывать соединение
Anton.
Да, вы совершенно правы) db.close() почему то выполняется раньше чем закончится зарос, уже исправил, спасибо)
yopp
если на это нет веских причин, то db.close явно вызвать не надо
yopp
открываете одно соединение когда запускается приложение
Anton.
если на это нет веских причин, то db.close явно вызвать не надо
Понял) Тоже задумывался над целесообразностью постоянного закрытия соединения)
Дмитрий
Всем привет, есть проблема над которой бьюсь уже пару дней: Дано: Javascript и связка Apollo ( GraphQL сервер ) <-> Mongoose ( драйвер ) <-> MongoDB Что нужно: чтобы при создании нового элемента сервер возвращал не только сам элемент, но и данные о том, кто создал этот элемент ( в терминологии Mongoose это применение populate ) при создании элемента в поле author записывается id соответствующий пользователю из коллекции users ( только id ). Собственно помимо id хочется видеть еще и имя, фамилию и пр. данные пользователя. То, что частично работает ( получено по первому же ответу от Google на запрос: "mongoose save .populate" ):
Дмитрий
в результате в консоль сервера console.log( "item:", item ); вываливается все, что нужно ( populate работает ),
Дмитрий
но, при этом строка console.log("result:", result); отрабатывает ранее и выводит result: undefined т.е. что-то с асинхронной моделью получения данных в javascript ( само собой пробовал различные варианты с async await, но, все без результата ), есть идея переписать эту часть на базе promises. Есть ли у кого рабочий вариант того, что я реализую - я пытаюсь изначально сделать эту конструкцию красиво, так как на базе нее фактически будет строится все приложение. Или же не стоит на это обращать столько внимания, так как promises populate ( здесь исправил, это видимо причина последующих вопросов ) это фишечка исключительно Mongoose, а не MongoDB, и по факту тот запрос к базе, что я пытаюсь сэкономить ( делая populate внутри save ) по факту Mongoose все-равно превращает в два запроса к MongoDB 1-й на save 2-й на выборку с populate ?
Дмитрий
Помимо реализации, что приведена выше мне попалась еще одна реализация через Pre middleware functions но, при попытке выполнить:
Дмитрий
возвращается ошибка: neweditor.pre is not a function
Дмитрий
Про реализацию через Pre middleware functions спрашиваю потому, что мне эта конструкция интереснее, так как помимо save она позволяет реализовывать и findOneAndUpdate ( следующая функция, что мне нужна ) Хотелось бы услышать, что я на верном пути, и что у кого-то это именно так и работает.
yopp
Две модели в монгусе == две коллеции. А значит populate тем или иным образом сделает два запроса в монгу
yopp
вообще, я не очень понимаю зачем в таких проостых случаях нужна вся эта асинхронность. в js какие-то примитивы для параллелизации, которые таким образом отдают управление назад шедулеру?
yopp
и если этого не делать, весь рантайм будет ждать пока io не закончится?
Дмитрий
и если этого не делать, весь рантайм будет ждать пока io не закончится?
наоборот, по умолчанию все идет параллельно, а это заставляет некоторые вещи делаться последовательно и ждать результата предыдущих функций ( у меня из-за этого return result отрабатывает ранее вывода вычислений в консоль )
Дмитрий
Две модели в монгусе == две коллеции. А значит populate тем или иным образом сделает два запроса в монгу
Тоже представлял себе этот вариант, и, меня это вполне устраивает - буде сам реализовывать два последовательных запроса. Спасибо..
yopp
для того чтоб вместо const result = foo(callback_hell), просто синхронно const result = foo(…); if(result) …
Дмитрий
в монгусе нет синхронных вызовов?
все есть, но, для переключения между синхронными/асинхронными применяются либо promises либо async await ( обертка над promises ).
yopp
странный язык :)
Дмитрий
странный язык :)
вроде async await сейчас модно и одна из свежих новостей - что конструкции async await добавлены в rust
Mike
странный язык :)
все там нормально ) над прост асинхронность и синхронность различать там
Дмитрий
Спасибо, завтра попробую..
Дмитрий
addeditor: async(_,args,context,info)=>{ try{ const editorauthor = await User.findOne({email: context.email}); const newEditor = new Editor({ name: args.name, description:args.description, author: editorauthor._id }) const result = await newEditor.save(); const item = await result.populate("author"); console.log(result); console.log(item); return item } catch(e){ someactionWithError(e) } }
отпишусь, что почти работает, const result = await newEditor.save(); console.log("result:", result); const item = await result.populate("author"); console.log("item:", item); const item2 = await result.populate("author", function(err, itempop) { if (err) { console.log("err:", err); } else { console.log("itempop:", itempop); } }); await console.log("item2:", item2); populate отрабатывает лишь для второго значения: console.log("itempop:", itempop); видимо какие-то особенности функции populate в mongoose
Alexey
Привет! Продолжаем нашу песню)) Может ли кластер работать с одним узлом? До поры естественно, пока место не кончится, дальше вводим еще один узел и тд
Дмитрий
зачем await кругом пихать то
тестирую, есть желание все реализовать на стрелочных функциях с async await
Mike
тестирую, есть желание все реализовать на стрелочных функциях с async await
вот так по идее работало бы const item2 = await Editor.find().populate();
Mike
тестирую, есть желание все реализовать на стрелочных функциях с async await
насколько я понимаю populate работает с query а у вас сохранение объекта
Nick
Привет! Продолжаем нашу песню)) Может ли кластер работать с одним узлом? До поры естественно, пока место не кончится, дальше вводим еще один узел и тд
Да можно, но это влечет за собой доработку софта, чтобы была возможность искать данные в обоих базах, с агрегациями будет намного тяжелеее. Но если данные холодные и их нужно только собирать на всякий случвй, то вполне нормальеое решение
Mike
вижу тут сразу две ошибки await console.log("item2:", item2); - ненужно await сверху тоже , но в целом так
addeditor: async(_,args,context,info)=>{ try{ const editorauthor = await User.findOne({email: context.email}); const newEditor = new Editor({ name: args.name, description:args.description, author: editorauthor._id }) const result = await newEditor.save(); const item = await Editor.find({_id: result._id}).populate("author"); console.log(result); console.log(item); return item } catch(e){ someactionWithError(e) } } вот так попробуйте
Дмитрий
И еще: мне ваш вариант нравится больше - за универсальность..
Mike
И еще: мне ваш вариант нравится больше - за универсальность..
то что вы написали выше лучше - там меньше запросов в бд на 1
Дмитрий
то что вы написали выше лучше - там меньше запросов в бд на 1
нет, выше ответили, что populate фо факту все-равно делает как минимум два обращения, так как данные собираются из нескольких коллекций
Anonymous
Добрый день. Мне нужно отобразить на фронте таблицу данных с пагинацией. Ищу пример пагинации в Монге, чтобы отсылать туда запросы с фронта. Наподобие https://stackoverflow.com/a/44857996/5524590, см. конец кода.
Stepan
Добрый день. Мне нужно отобразить на фронте таблицу данных с пагинацией. Ищу пример пагинации в Монге, чтобы отсылать туда запросы с фронта. Наподобие https://stackoverflow.com/a/44857996/5524590, см. конец кода.
Добрый. А запросы же через какой-то backend пойдут? Может тогда стоит посмотреть встроенную пагинацию в ORM, которая используется на бэке?
Stepan
Как пример (не знаю близок ли вам python) могу вот это привести https://github.com/MongoEngine/flask-mongoengine/blob/a0b0cf80ec321d29baca743e4075101db6be7d68/flask_mongoengine/pagination.py
Artem [GMT+2]
Привет! Народ ткните носом в доку, с какой стороны подойти к задачке. Есть коллекция с визитами в помещение (дата входа, дата выхода). Даты со временем Нужно построить запрос который бы возвращал разбивску по часам солько людей было в помещении в конкретный час (ну точнее промежуток)
Stepan
Привет! Народ ткните носом в доку, с какой стороны подойти к задачке. Есть коллекция с визитами в помещение (дата входа, дата выхода). Даты со временем Нужно построить запрос который бы возвращал разбивску по часам солько людей было в помещении в конкретный час (ну точнее промежуток)
Точно нужны будут group: https://docs.mongodb.com/manual/reference/operator/aggregation/group/ count: https://docs.mongodb.com/manual/reference/operator/aggregation/count/ Для времени возможно (не уверен) вот это потребуется: https://docs.mongodb.com/manual/reference/operator/aggregation/hour/
Artem [GMT+2]
это понятно.. как получить нулевые группы при помощи group..
Stepan
это понятно.. как получить нулевые группы при помощи group..
Это уже совсем другой вопрос. Возможно нужно было его так сразу и озвучивать :)
Stepan
это понятно.. как получить нулевые группы при помощи group..
Из простого на ум приходит сходу только напилить постпроцессинг полученных данных уже в коде. Чтобы натыкать нулей в пропущенные часы. Как в запросе это сразу сделать, увы, не подскажу.
yopp
это понятно.. как получить нулевые группы при помощи group..
Наиболее простой вариант: как выше подсказали, не делать этого в монге. Если очень сильно надо, то после группировок сделать ещё одну группу в которую собрать все присутствующие часы в один массив, после этого сделать $map по статически объявленному массиву с 24 часами и внутри map по условию проверять, есть ли такой час в оригинальных результах и если нет, то вставлять «пустой» час. После чего $unwind по полученному полю
Anonymous
Добрый. А запросы же через какой-то backend пойдут? Может тогда стоит посмотреть встроенную пагинацию в ORM, которая используется на бэке?
Серверные запросы: https://github.com/ElAnonimo/job-fullstack/blob/master/routes/api/subscriptions.js. Сервер на Node.js. Сейчас делаю запрос в Монгу с пагинацией для запроса на стр. 7, на фронте будет таблица, выводящая по 10 строк (далее будет dropdown с числом отображаемых строк) и с пагинацией по этой таблице.
Anonymous
Моё гугление показало, эффективней "Mongo pagination", чем "Mongoose pagination". Хотя второе не пробовал. В любом случае, спасибо за ссылки.
Anonymous
У нас не принято отправлять «погуглить»
Полезно, мне видится, указать, что ссылки или фразы для поиска полезны. Пользователь привёл такую фразу.
yopp
Нет, не полезно
yopp
Полезно дать ссылку на конкретный материал
Anonymous
Елси б я не знал, что мне нужно искать "что-то pagination", такой ответ направил бы в нужном направлении.