Дмитрий
Есть ещё вопрос. У меня в данных есть параметр id, он всегда уникальный. Выгоднее для скорости работы его сделать вместо внутренней _id, что по умолчанию в монге?
Dmitriy
а зачем вам трогать внутреннее поле _id, сделайте доп. поле id с уникальным индексом и пишите в него ваше имеющиеся идентификаторы. а системное поле _id оставьте генерировать монге
Дмитрий
а зачем вам трогать внутреннее поле _id, сделайте доп. поле id с уникальным индексом и пишите в него ваше имеющиеся идентификаторы. а системное поле _id оставьте генерировать монге
Просте я по своему этому id потом часто буду искать инфу, вот мне и показалось, что тогда поиск по моему id будет быстрее проходить
Dmitriy
уникальный индекс он и в "primary key" уникальный индекс
Дмитрий
уникальный индекс он и в "primary key" уникальный индекс
Ммм. То есть смысла нет переназначать монговский ид на мой ид?
Dmitriy
ну лично я не вижу в этом какого-то смысла. может быть @dd_bb или @yatoba меня поправят?
Дмитрий
Спасибо, понял. Не буду переназначать
yopp
Ммм. То есть смысла нет переназначать монговский ид на мой ид?
Если вы его можете использовать вместо _id, как основной ключ, то почему бы и нет
Ivan
Привет! А что будет с репликасетом из мастер-сек-сек, если мастер потеряет обоих секондари? Остановит работу? Станет other? или останется мастером? допустим, порвалась связь между мастером и обоими секондари, причём между секондари связь осталась.(у них кворум будет, они там выберут себе другого мастера, так?)
yopp
https://docs.mongodb.com/manual/core/replica-set-elections/
yopp
When the primary detects that it can only see a minority of nodes in the replica set, the primary steps down as primary and becomes a secondary. Independently, a member in the partition that can communicate with a majority of the nodes (including itself) holds an election to become the new primary.
yopp
Просто остановить secondary
yopp
Но надо учитывать что secondary сможет догнать primary без полной синхронизации только если ему для этого хватит оплога
Евгений
Добрый день. есть документ ["_id"]=> object(MongoDB\BSON\ObjectId)#2227 (1) { ["oid"]=> string(24) "5e9da778b1b5d11e7b753385" } ["parent_id"]=> int(13354829) ["name"]=> string(24) "Тестирование" мне надо найти все документы с максимальным "parent_id" 1. я могу найти максимальный "parent_id", а потом все документы, но это 2 запроса 2. я могу сделать так db.childs.aggregate([{$group:{_id:"$parent_id", fullDocument:{$push:"$$ROOT"}, count:{$sum:1}}},{$sort:{"_id":-1}},{$limit:1}]) это один запрос, но даже хуже первого варианта, наверно, т.к. будет долго генерироваться и сожрет кучу памяти хочется как в первом варианте, но одним запросом гугл везде второй вариант предлагает
yopp
Первыми результатами вы получите документы с максимальным значением parent_id
yopp
И когда в процессе перебора курсора у вас значение поменяется, просто закройте курсор
Евгений
сделать убывающий индекс по parent_id и просто в find отсортировать документы по убыванию
db.childs.find({}).sort({'parent_id':-1}).limit(1).pretty() угу так один документ покажет а надо все, а я не знаю, сколько их
yopp
Вы можете спокойно перебирать курсор, так как он по индексу. А значит монге не надо сортировать документы
Евгений
Вы можете спокойно перебирать курсор, так как он по индексу. А значит монге не надо сортировать документы
я понимаю это перфекционизм во мне говорит ) без лишних действий готовый результат
yopp
Тогда индекс и два запроса
yopp
Перебирать курсор это самый простой выход
Евгений
Тогда индекс и два запроса
т.е., первый вариант )
yopp
Ну вы не хотите самым простым пользоваться :)
Евгений
Ну вы не хотите самым простым пользоваться :)
в коде перебор выглядит костыльно, но будет выигрышным по времени по сравнению с другими способами, а в консоли удобнее двумя командами, получается
yopp
Почему костыльно-то?
yopp
у вас условие звучит ровно так
yopp
Отсортировать и выбрать самые верхние элементы
Евгений
Почему костыльно-то?
ну, я не могу сказать, что у меня колоссальный опыт, но разве не быстрее, красивее, проще, читабельнее выглядит вариант, когда база возвращает уже готовые к использованию данные?
Rinat
Всем привет! Подскажите, пожалуйста, как правильно сделать. Формируется json: { "entityId": "", "start_date": "", "end_date": "", "url_name": "", "array": [ { "city": "", "traffic": "" }, { "city": "", "traffic": "" }, { "city": "", "traffic": "" } ] } Если обновляется постоянно array, то правильно сделать связь с url_name, добавить в массив id и добавлять данные id,city,traffic? Или просто обновлять массив данными city и traffic?
Евгений
Про что?
про совмещение запросов внутри транзакции
yopp
про совмещение запросов внутри транзакции
В вашем случае это необходимо если вы будете пользоваться результатам дальше, особенно если что-то будете писать. Если пользоваться не будете или добавление более новых документов роли для вас не играют, тогда можно без транзакции. Но нужно понимать что между первым и вторым find максимальное значение может измениться
Евгений
В вашем случае это необходимо если вы будете пользоваться результатам дальше, особенно если что-то будете писать. Если пользоваться не будете или добавление более новых документов роли для вас не играют, тогда можно без транзакции. Но нужно понимать что между первым и вторым find максимальное значение может измениться
я, если честно, не думал, что потребуется углубляться, но, видимо, надо раз нельзя вкладывать запрос в запрос (типа действий в скобках арифметических), то можно еще сюда посмотреть http://dirolf.com/2010/04/05/stored-javascript-in-mongodb-and-pymongo.html
Евгений
Не стоит. Если прямо очень сильно хочется, то можно через $lookup
просто, в силу молодости бд, видимо, функционал еще не так развит, как во всяких sql
yopp
Я считаю хранимые процедуры и триггером очень неэффективным и опасным механизмом, который допустимо для реализации storage level фич. Например глобального аудита или ещё каких-то вещей, которые не будут размазывать бизнес-логику по базе. Подготовка такого рода ответа в базе данных есть частный случай переноса бизнес логики. А в частности логики выборки. Ваш кейс одинаково элементарно решается и в монге и в табличных хранилищах с помощью итерации по курсору. Если возникнет боттлнек из-за того что в первый батч курсора попадает слишком много документов с меньшим значением, то можно рассмотреть случай с двумя запросами. В том случае если возникнет боттлнек из-за RTT на двух запросах, то можно использовать подзапросы. В частности $lookup. Тогда в верхнем запросе вы через $limit найдёте старший документ, а через $lookup в эту-же коллекцию выберете только те документы которые вас нужны. Как видите у остальных вариантов куча «если» и общий смысл сводиться к решению потенциальных проблем с производительностью, которые скорее всего не возникнут. Вариант с $lookup ещё может быть использован если вам нужен view
Евгений
Я считаю хранимые процедуры и триггером очень неэффективным и опасным механизмом, который допустимо для реализации storage level фич. Например глобального аудита или ещё каких-то вещей, которые не будут размазывать бизнес-логику по базе. Подготовка такого рода ответа в базе данных есть частный случай переноса бизнес логики. А в частности логики выборки. Ваш кейс одинаково элементарно решается и в монге и в табличных хранилищах с помощью итерации по курсору. Если возникнет боттлнек из-за того что в первый батч курсора попадает слишком много документов с меньшим значением, то можно рассмотреть случай с двумя запросами. В том случае если возникнет боттлнек из-за RTT на двух запросах, то можно использовать подзапросы. В частности $lookup. Тогда в верхнем запросе вы через $limit найдёте старший документ, а через $lookup в эту-же коллекцию выберете только те документы которые вас нужны. Как видите у остальных вариантов куча «если» и общий смысл сводиться к решению потенциальных проблем с производительностью, которые скорее всего не возникнут. Вариант с $lookup ещё может быть использован если вам нужен view
мой случай, действительно, простой я не считаю себя достаточно квалифицированным, чтобы спорить с вами, но, если честно, мне нравится концепция серверлесс, в целом, и возможность реализации бизнес-логики на уровне бд, в частности (если это быстрее, чем в контроллере, конечно, я же не маньяк ) )
Denis 災 nobody
Надо сделать дамп монги, но со специально добавленной ноды с задержкой (delayed replicaset). Но я так понимаю, мне нужно ограничить чтение только с этой ноды, мало просто указать —host на неё?
Denis 災 nobody
кто дампит, поделитесь советами
Denis 災 nobody
Read Preference By default, mongodump uses read preference primary. To override the default, you can specify the read preference in the --readPreference command-line option or in the --uri connection string.
Daniyar
привет всем.. вопрос был.. как можно найти заказы только на 10 дней вперед, имею в виду если сегодня 22.04, то он мне достанет все от 22.04 до 02.05 по createdAt -> Order.find({createdAt: ...}) ?
Daniyar
ааа..все решил
Alexandr
Всем привет. Использую mongoose. Есть задача: найти минимальное значение в атрибуте. Значения могут быть строкой/числом/массивом чисел/массивом строк. Пытаюсь сделать так: Model.findOne() .exists([field]) .sort({ [field]: 1}) Но минимальным значением считается пустой массив. Если отсеять пустые массивы с помощью {$ne: []} то с массивами отрабатывает как надо, но вылетает ошибка при попытке сравнения со строковым значением. Model.findOne() .exists(field).ne(field, []) .sort({ field: 1}) Есть какой-то способ провернуть такое?
yopp
Если они будут нормализированы до массива элементов одного типа, то в этом случае возможно
Anonymous
а есть использует руби-драйвер для монго ? есть вопрос про .find_one_and_update вместе с $set и $cond внутри ) хочу использовать в таком виде: User.where(blabla).find_one_and_update({ $set: { my_field: { $cond: { if: …. Но получаю такую ошибку, возмоожно ли как-то переписать синтаксически ? The dollar ($) prefixed field '$cond' in ‘my_filed.$cond' is not valid for storage
vveare138
”$set” и ”$cond”. т.е. измени на строковые ключи
Dmitriy
а есть использует руби-драйвер для монго ? есть вопрос про .find_one_and_update вместе с $set и $cond внутри ) хочу использовать в таком виде: User.where(blabla).find_one_and_update({ $set: { my_field: { $cond: { if: …. Но получаю такую ошибку, возмоожно ли как-то переписать синтаксически ? The dollar ($) prefixed field '$cond' in ‘my_filed.$cond' is not valid for storage
$cond - это оператор агрегашен фреймворка: https://docs.mongodb.com/manual/reference/operator/aggregation/cond/ соответственно если вы хотите его использовать, то вам нужно посмотреть в этот мануал: https://docs.mongodb.com/manual/tutorial/update-documents-with-aggregation-pipeline/ и убедится соответствует ли ваша версия субд требованиям, а так же исправить запрос, т.к. pipeline пишется как массив
Anonymous
”$set” и ”$cond”. т.е. измени на строковые ключи
Там строки Я для примера написал так
Artem
Здарова, есть такой запрос https://i.imgur.com/dApLyTI.png хочется результатом агрегации вернуть заявки (согласно пагинации) и рядом массив с _id всех зявок (то есть вообще всех, подходящих по запросу). Такое возможно сделать за одну агрегацию?
Roman
Вопрос к тем кто работает на удаленке. Как контролируют время: работаешь ты или нет?
Denis 災 nobody
трекеры времени..
Denis 災 nobody
которые скрины делают
Andrey
говорят, что сделать, ты делаешь, конец
Denis 災 nobody
Например?
webwork tracker
Denis 災 nobody
но в целом так себе идея. Разве что для самоконтроля
Roman
говорят, что сделать, ты делаешь, конец
Например, буду работать по 8 часов и не успевать сделать тз, то...
Andrey
кривая оценка, кривые руки, совокупность
Roman
А в офис пришел, отсидел 8 часов и пошел(ну написал что-то), а на удаленки аналогию проведите
Denis 災 nobody
Например, буду работать по 8 часов и не успевать сделать тз, то...
то кто-то не умеет планировать время. Возможно тот, кто давал задачу. Или недостаточно квалификации
Dmitriy
А в офис пришел, отсидел 8 часов и пошел(ну написал что-то), а на удаленки аналогию проведите
Удаленка отсеевает планктон, который не умеет планировать и соблюдать сроки :) все просто
Nick
Например, буду работать по 8 часов и не успевать сделать тз, то...
если у вас сроки горят, то либо вы неправильно дали оценку и нужно тогда вджобывать больше 8 часов чтобы успеть, либо проект не срочный и сроки на самом деле ни на что не влияют и можно так же делать как делается. Если первый случай с отставанием еще не наступил, а только планируется начать удаленку в таком режиме, то лучше перезаложите сроки