Dee
Всем спасибо за помощь, постараюсь протащить эту идею.
madspectator
А я так _id использую, добавляю его вторым полем в индекс по нужному полю. Например, индекс есть на поле foo. Я делаю индекс {foo: 1, _id: 1}. Далее, если мне надо проитерироваться по коллекциюю по условию {foo: "ok"}, я итерируюсь с .limit(1000).sort({_id: 1}) и запоминаю послединий _id и далее использую его для того, чтобы вытащить вторую тысячу и т.д.
Алишер Абдуллаев
yopp
если у вас заранее известны бакеты, то да
Алишер Абдуллаев
Алишер Абдуллаев
ну дальше уже логика какая ))
yopp
работает и отлично. но скорее всего в будущем, хранящиеся отдельно даты и время, да ещё и в сторках будут доставлять много боли
Алишер Абдуллаев
ну уже дальше по логике))
Никита
добрый день всем! вопрос по перформансу: насколько хорошо монго выдержит вложенные в сущность массивы по 5 тысяч элементов? все 5 тысяч - чисто строки
Никита
смотря что с ними делается
ничего, хранятся лишь, иногда дополняются
Никита
поиска по ним не будет точно
Nick
тогда нормально, помните только что при работе с доком он всегда целиком считывается
madspectator
И больше 16мб не влезет.
Anonymous
Сейчас разбираю адовою легаси коллекцию
Anonymous
Кто может посоветовать, что почитать, по advanced filtering
Anonymous
Сейчас даже по фану пришлю снип
yopp
ничего, хранятся лишь, иногда дополняются
При обновлении документ будет обновляться целиком. Если latency при апдейтах не играет больший роли, то вполне ок.
Anonymous
https://paste.ubuntu.com/p/Z4tYjCSYrX/ ну не слишком адовая конечно, но страдать приходится хочу оптимизировать следующим образом - item.area.id перевести из string в int - cейчас ищу следующим образом: db.places.find({"item.type.id": "3"}) если id перекинуть в самое начало документа, тоесть db.places.find({"id": 3}) может ли мне это помочь ускорить поиск?
yopp
По item.type.id есть индекс?
Anonymous
По item.type.id есть индекс?
да, индекс есть
Anonymous
yopp
Покажите explain с execution stats
Anonymous
Покажите explain с execution stats
https://paste.ubuntu.com/p/3R4f4KHmXJ/ name, id - это маппинг к коллекции categories фронт также отправляет: page, items_per_page
yopp
Судя по explain у вас нет индекса
yopp
db.places.getIndexes() что показывает?
Anonymous
правильно ли понимаю, что нужно ручками проиндексировать item.type ?
yopp
item.type.id, да
Anonymous
сделал db.places.createIndex({"item.type.id": -1}) если не ошибаюсь стало быстрее) будьте, добры, подскажите, все правильно сделал?)
Anonymous
благодарю за интересную информацию
Valdis
всем привет. надо смигрировать данные из одной бд в другую. пишу скрипт. беру 50 записей из первой и хочу вставить в другую. есть метод insertMany, где просто вставляются записи. но мне надо предусмотреть случай когда запущена повторная миграция. поэтому я хочу чтобы массив записей или обновлялся или добавлялся. findOrUpdate. как это сделать?
yopp
Так как _id сохраняется то повторная миграция свалится с ошибкой
Valdis
mongodump/mongorestore
а если бд на серваке, к которому нет доступа и буду работать через подключение к бд
yopp
Вставлять документы целиком с сохранением _id
yopp
Если нужна гарантия all or nothing, то внутри транзакции
Valdis
есть вариант идти циклом по всем документам и на каждый update вызывать, но надо пачкой
Valdis
транзакция сомневаюсь что на несколько лямов записей будет норм
Valdis
хочу разбивать на несколько подходов
yopp
Нет смысл разбивать
yopp
mongorestore делает insert последовательно и все :)
Valdis
ага, то есть mongorestore вообще поэлементно работает?)
Valdis
прикольно
yopp
Возможно сейчас используется bulkWrite, так как есть сессии и возможность получить статусы конкретных операций, но до 3.4 просто insert
yopp
Разницы для монги нет
yopp
Bulk операции это сетевая оптимизация, экономия на ack
yopp
Ну и с появлением wire compression если документы похожие, то от сжатия выиграть можно немног
Valdis
Bulk операции это сетевая оптимизация, экономия на ack
хотел сделать подобное const records = await dbSource .collection(coll.name) .find() .skip(i) .limit(limit) .toArray(); const promises = []; for (const rec of records) { promises.push({ updateOne: { update: rec, upsert: true, }, }); } await dbTarget .collection(coll.name) .bulkWrite({}, promises, { ordered: false });
yopp
Это будет очень медленно
yopp
Сделайте просто insert, передав _id оригинального документа
yopp
Этого будет более чем достаточно, так как повторная вставка будет нарушать unique constrain для _id
yopp
Это достаточная гарантия
Valdis
const records = await dbSource .collection(coll.name) .find() .skip(i) .limit(limit) .toArray(); try { await dbTarget .collection(coll.name) .insertMany(records); } catch (err) { console.log('elements already migrated'); } тогда так и оставлю)
yopp
Не вижу смысла в skip/limit
Valdis
но если на несколько миллионов  src коллекция
yopp
И ничего
Valdis
с базой все норм будет?
Valdis
и в чем трабл, как вижу, то если в коллекции в таргет базе были 2 элемента из соурс коллекции, в соурс добавил еще один элемент и при этом коде он скипается, так как в пачке были повторяющиеся элементы
yopp
skip/limit будет дороже
Valdis
skip/limit будет дороже
но там же через ожидания работать будет. и будет по условно 200 элементов за раз вместо 2 млн
yopp
Skip дорого, потому что монге надо пропустить какое-то количество документов. А чтоб это сделать, надо в любом случае проехать как минимум по индексу
Valdis
понял. хорошо а что делать с
yopp
Самый простой вариант остановить запись на время миграции
yopp
А в чём смысл миграции?
Valdis
А в чём смысл миграции?
В предыдущей версии приложения сервис стучался в бд. В следующей меняем на другую и надо перенести все данные в новую
yopp
Нужно перенести данные на другой физический сервер?
Valdis
Между авс инстансами Так что да Поэтому и пишу отдельный скрипт + доступа к сервакам с бд нет
yopp
Самый надежный вариант это поднять репликацию
yopp
Это вариант с минимальным временем отказа
yopp
В обратном случае вам потребуется остановить запись на время миграции