Дмитрий
Дмитрий
Есть ещё вопрос. У меня в данных есть параметр id, он всегда уникальный. Выгоднее для скорости работы его сделать вместо внутренней _id, что по умолчанию в монге?
Dmitriy
а зачем вам трогать внутреннее поле _id, сделайте доп. поле id с уникальным индексом и пишите в него ваше имеющиеся идентификаторы. а системное поле _id оставьте генерировать монге
Дмитрий
Dmitriy
уникальный индекс он и в "primary key" уникальный индекс
Дмитрий
Dmitriy
ну лично я не вижу в этом какого-то смысла. может быть @dd_bb или @yatoba меня поправят?
Дмитрий
Спасибо, понял. Не буду переназначать
Ivan
Привет!
А что будет с репликасетом из мастер-сек-сек, если мастер потеряет обоих секондари?
Остановит работу? Станет other? или останется мастером?
допустим, порвалась связь между мастером и обоими секондари, причём между секондари связь осталась.(у них кворум будет, они там выберут себе другого мастера, так?)
Ilshat
yopp
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.
Ivan
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
Добрый день.
есть документ
["_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}])
это один запрос, но даже хуже первого варианта, наверно, т.к. будет долго генерироваться и сожрет кучу памяти
хочется как в первом варианте, но одним запросом
гугл везде второй вариант предлагает
сделать убывающий индекс по parent_id и просто в find отсортировать документы по убыванию
yopp
Первыми результатами вы получите документы с максимальным значением parent_id
yopp
И когда в процессе перебора курсора у вас значение поменяется, просто закройте курсор
yopp
yopp
Вы можете спокойно перебирать курсор, так как он по индексу. А значит монге не надо сортировать документы
Евгений
yopp
Тогда индекс и два запроса
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 максимальное значение может измениться
Евгений
Евгений
yopp
yopp
Евгений
Я считаю хранимые процедуры и триггером очень неэффективным и опасным механизмом, который допустимо для реализации storage level фич. Например глобального аудита или ещё каких-то вещей, которые не будут размазывать бизнес-логику по базе.
Подготовка такого рода ответа в базе данных есть частный случай переноса бизнес логики. А в частности логики выборки.
Ваш кейс одинаково элементарно решается и в монге и в табличных хранилищах с помощью итерации по курсору.
Если возникнет боттлнек из-за того что в первый батч курсора попадает слишком много документов с меньшим значением, то можно рассмотреть случай с двумя запросами.
В том случае если возникнет боттлнек из-за RTT на двух запросах, то можно использовать подзапросы. В частности $lookup. Тогда в верхнем запросе вы через $limit найдёте старший документ, а через $lookup в эту-же коллекцию выберете только те документы которые вас нужны.
Как видите у остальных вариантов куча «если» и общий смысл сводиться к решению потенциальных проблем с производительностью, которые скорее всего не возникнут.
Вариант с $lookup ещё может быть использован если вам нужен view
мой случай, действительно, простой
я не считаю себя достаточно квалифицированным, чтобы спорить с вами, но, если честно, мне нравится концепция серверлесс, в целом, и возможность реализации бизнес-логики на уровне бд, в частности (если это быстрее, чем в контроллере, конечно, я же не маньяк ) )
Denis 災 nobody
Надо сделать дамп монги, но со специально добавленной ноды с задержкой (delayed replicaset). Но я так понимаю, мне нужно ограничить чтение только с этой ноды, мало просто указать —host на неё?
Denis 災 nobody
кто дампит, поделитесь советами
Gleb
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
ааа..все решил
Dmitriy
Daniyar
Alexandr
Всем привет. Использую mongoose.
Есть задача: найти минимальное значение в атрибуте. Значения могут быть строкой/числом/массивом чисел/массивом строк.
Пытаюсь сделать так:
Model.findOne()
.exists([field])
.sort({ [field]: 1})
Но минимальным значением считается пустой массив.
Если отсеять пустые массивы с помощью {$ne: []} то с массивами отрабатывает как надо, но вылетает ошибка при попытке сравнения со строковым значением.
Model.findOne()
.exists(field).ne(field, [])
.sort({ field: 1})
Есть какой-то способ провернуть такое?
yopp
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”. т.е. измени на строковые ключи
Anonymous
Artem
Здарова, есть такой запрос https://i.imgur.com/dApLyTI.png хочется результатом агрегации вернуть заявки (согласно пагинации) и рядом массив с _id всех зявок (то есть вообще всех, подходящих по запросу). Такое возможно сделать за одну агрегацию?
Dmitriy
Artem
Roman
Вопрос к тем кто работает на удаленке. Как контролируют время: работаешь ты или нет?
Denis 災 nobody
трекеры времени..
Denis 災 nobody
которые скрины делают
Roman
Nick
Andrey
говорят, что сделать, ты делаешь, конец
Denis 災 nobody
но в целом так себе идея. Разве что для самоконтроля
Andrey
кривая оценка, кривые руки, совокупность
Roman
А в офис пришел, отсидел 8 часов и пошел(ну написал что-то), а на удаленки аналогию проведите
Dmitriy
Roman
Nick
Например, буду работать по 8 часов и не успевать сделать тз, то...
если у вас сроки горят, то либо вы неправильно дали оценку и нужно тогда вджобывать больше 8 часов чтобы успеть, либо проект не срочный и сроки на самом деле ни на что не влияют и можно так же делать как делается. Если первый случай с отставанием еще не наступил, а только планируется начать удаленку в таком режиме, то лучше перезаложите сроки