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
}
}
}
)``
yopp
Anton.
yopp
В логах самой монги, не вашего приложения
Anton.
Оуф, секунду поищу
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
открываете одно соединение когда запускается приложение
Дмитрий
Всем привет, есть проблема над которой бьюсь уже пару дней:
Дано: 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 не закончится?
yopp
yopp
для того чтоб вместо const result = foo(callback_hell), просто синхронно const result = foo(…); if(result) …
Дмитрий
в монгусе нет синхронных вызовов?
все есть, но, для переключения между синхронными/асинхронными применяются либо promises либо async await ( обертка над promises ).
yopp
странный язык :)
Дмитрий
странный язык :)
вроде async await сейчас модно и одна из свежих новостей - что конструкции async await добавлены в rust
Mike
странный язык :)
все там нормально ) над прост асинхронность и синхронность различать там
Mike
Всем привет, есть проблема над которой бьюсь уже пару дней:
Дано: Javascript и связка
Apollo ( GraphQL сервер ) <-> Mongoose ( драйвер ) <-> MongoDB
Что нужно:
чтобы при создании нового элемента сервер возвращал не только сам элемент, но и данные о том, кто создал этот элемент ( в терминологии Mongoose это применение populate ) при создании элемента в поле author записывается id соответствующий пользователю из коллекции users ( только id ). Собственно помимо id хочется видеть еще и имя, фамилию и пр. данные пользователя.
То, что частично работает ( получено по первому же ответу от Google на запрос: "mongoose save .populate" ):
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)
}
}
Дмитрий
Спасибо, завтра попробую..
Дмитрий
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
Привет! Продолжаем нашу песню)) Может ли кластер работать с одним узлом? До поры естественно, пока место не кончится, дальше вводим еще один узел и тд
Mike
отпишусь, что почти работает,
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
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); вот это страная сама вещь которую я видел
Mike
отпишусь, что почти работает,
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
зачем await кругом пихать то
Дмитрий
Mike
Mike
Alexey
Дмитрий
Alexey
Дмитрий
Дмитрий
И еще: мне ваш вариант нравится больше - за универсальность..
yopp
Anonymous
Добрый день.
Мне нужно отобразить на фронте таблицу данных с пагинацией. Ищу пример пагинации в Монге, чтобы отсылать туда запросы с фронта. Наподобие https://stackoverflow.com/a/44857996/5524590, см. конец кода.
Stepan
Stepan
Как пример (не знаю близок ли вам python) могу вот это привести https://github.com/MongoEngine/flask-mongoengine/blob/a0b0cf80ec321d29baca743e4075101db6be7d68/flask_mongoengine/pagination.py
Artem [GMT+2]
Привет! Народ ткните носом в доку, с какой стороны подойти к задачке.
Есть коллекция с визитами в помещение (дата входа, дата выхода). Даты со временем
Нужно построить запрос который бы возвращал разбивску по часам солько людей было в помещении в конкретный час (ну точнее промежуток)
Artem [GMT+2]
это понятно.. как получить нулевые группы при помощи group..
yopp
это понятно.. как получить нулевые группы при помощи group..
Наиболее простой вариант: как выше подсказали, не делать этого в монге.
Если очень сильно надо, то после группировок сделать ещё одну группу в которую собрать все присутствующие часы в один массив, после этого сделать $map по статически объявленному массиву с 24 часами и внутри map по условию проверять, есть ли такой час в оригинальных результах и если нет, то вставлять «пустой» час. После чего $unwind по полученному полю
Stepan
yopp
Stepan
Anonymous
Моё гугление показало, эффективней "Mongo pagination", чем "Mongoose pagination". Хотя второе не пробовал.
В любом случае, спасибо за ссылки.
yopp
Нет, не полезно
yopp
Полезно дать ссылку на конкретный материал
Anonymous
Елси б я не знал, что мне нужно искать "что-то pagination", такой ответ направил бы в нужном направлении.