Ilya
я имелл ввиду как именно документ в массиве выглядит
p
project: {"arr.doc1.field1": 0}
помогло, спасибо! да, описал не очень правильно, извиняюсь
Oleg
Коллеги, подскажите. Удаление данных с помощью bulk вешает lock на базу ?
yopp
Коллеги, подскажите. Удаление данных с помощью bulk вешает lock на базу ?
https://docs.mongodb.com/manual/faq/concurrency/#what-locks-are-taken-by-some-common-client-operations
yopp
Напомню: bulk это просто способ передачи команд в монгу. Вместо цикла один запрос — один ответ на каждую, они группой передаются на сервер и там исполняются. Получается много запросов — один ответ. Сами команды выполняются в монге как обычно.
Oleg
@dd_bb спасибо. хорошо что intent
Vlad
Добрый день. Ради теста на одной из реплик кластера восстановили ошибочные данные в бд local. После этого автоматически нода неподнимается с сыпет ошибкой: mongod.27017[28513]: [initandlisten] Fatal assertion 40466 TooManyMatchingDocuments: More than singleton document found in namespace: local.replset.minvalid at src/mongo/db/repl/replication_consistency_markers_impl.cpp 87 Можно ли восстановить косячную ноду через удалении коллекции или в таких случаях только восстановление из бекапа? Локально на ноду можно зайти без опций репликации.
yopp
удалить данные и синхронизировать ноду с кластером по новой
yopp
если бекапы у вас попадают в replication window, то можно и из бекапа
Vlad
Да так и сделал. Удалил сбоившую коллекцию и запустил реплику.
Dmitry
😎
Dmitry
правда юзер с этим именем исчез после этого...
A
а он не подтянется при репликации?
Yurii
правда юзер с этим именем исчез после этого...
https://docs.mongodb.com/manual/reference/method/db.collection.update/#update-parameter
Dmitry
твою мать
Yurii
если хочешь обновить только одно поле - {$set: {status: "admin"}}
Yurii
в противном случае, ты обновляешь весь документ на то, что передал вторым параметром
vitalii
let user_tracksSchema = new mongoose.Schema({ id: { type: String, required: true, unique: true }, playlist:[{ playlistName: { type:String }, tracks:[{ trackName: {default: "Noname", type: String}, artistName: String, albumName: String, duration_ms: String, preview_url: String }] }] }); не могу запушить треки в плейлист по названию , кто знает в чем проблема . user_tracks.findOneAndUpdate({$and:[{id: req.decoded._id},{"playlist.playlistName":"default"}]},{$push:{"tracks.trackName":"myFirstTrack"}},(err,doc)=>{ res.json({status:200,tracks:doc}); });
pinelover
tracks.$.trackName, не?
SvPupok
коллеги, простите великодушно, запамятовал, как в js скрипте можно обьявить чтение с secondary нод репликасета? с телефона просто неудобно гуглить(
Vadim
Ты кодишь с телефона?
SvPupok
все, вспомнил, rs.slaveOk()
SvPupok
Bandikoot
все, вспомнил, rs.slaveOk()
это вроде должно включить только возможность чтения с секондари. чтобы задать наверняка есть .readPref(secondary), который к курсору применяется
SvPupok
из головы вылетело именно как обьявлять возможность чтения, а readPreference - эт само собой
Ilya
Всем добрый день, подскажите с таким вопросом: Есть документ вида: { _id: ObjectID name: string ...., items: [ { name: string type: string size: int }, ... ] } как видно у него есть массив вложенных документов items, в нем могут быть несколько тысяч. как при выборке ограничить элементы в items? на сайте монги советуют использовать аггрегации, но с ними проблема начинается в том что необходимо испольховать skip и limit, и в этом случае запрос начинает работать очень медленно
Ilya
в смысле вынести в коллекцию отдельную?
Javed
Ну да, где он имеет ещё одну поля создателя и хранить там ай ди его
Javed
Я не спец, тоже учусь
Ilya
да пагинацию
Yurii
да пагинацию
и ты делаешь {$unwind: "items"}, а потом $skip и $limit?
Ilya
нет $unwind не пробывал, если его сделать и отфильровать то в результате будут только те items которые попали в условие?
Yurii
нет $unwind не пробывал, если его сделать и отфильровать то в результате будут только те items которые попали в условие?
ну я не знаю, как ты делаешь, тут же нет твоей агрегации. Вообще оно должно быть как-то так db.collection.aggregate([ {$match: {_id: someId}}, {$unwind: "items"}, {$skip: 0}, {$limit: 50} ])
Yurii
ну понятно, что skip и limit это уже твои настройки пагинации
Ilya
эээ дак что в этом случае дал unwind ?
Yurii
эээ дак что в этом случае дал unwind ?
у нас появилось количество = длине массива items одинаковых документов (кроме поля items), у которых items - уникальный объект, а не массив
Ilya
я наверно плохо сформулировал
Ilya
есть документ у которого в items тысячи вложенных документов, мне надо вывести этот же документ но с чтобы в items остались только те корые удовлетворяют условию
Yurii
тогда вместо $unwind - https://docs.mongodb.com/manual/reference/operator/aggregation/slice/
Ilya
nак пагинация и items никак не связанны - пагинация для документа всего а не для items,
Ilya
items надо по фильтру отфитровать а не по кол-ву
Yurii
ну тут ты сказал, что надо именно пагинацию 🤔
Yurii
тебе надо пагинацию, что ты skip и limit используешь, или просто последние несколько штук?
Yurii
да пагинацию
Ilya
пагинацию для всего документа
Ilya
я не говорил что для items
Yurii
ну вопрос же был как раз за items
Yurii
ладно, проехали
Yurii
возвращайся тогда сюда: db.collection.aggregate([ {$match: some_criteria }, {$skip: skip_qty }, {$limit: limit_qty } {$project: { items: {$filter: { input: "$items" as: "item", cond: { do_some_cond_with_$$item } }}, project_all_need_fileds: 1 }} ]) https://docs.mongodb.com/manual/reference/operator/aggregation/filter/
Yurii
в таком случае ты делаешь сначала пагинацию по документах, а потом фильтруешь внутринности items по переденным критериям
Ilya
ок, спасибо сейчас попробую
Ilya
в общем работает, но опять та же самая проблема как только добавляешь skip - сразу скорость запроса проседает =(
Дмитрий
Со скипом всегда проседает. Это инородное понятие для NoSQL. Индексы сделаны?
Дмитрий
В теории если зададите критерии - скорость будет выше.
Дмитрий
Т.е. если у вас есть итерационное или предсказуемое поле его можно сформировать и скорость вывода уведичится
Ilya
Т.е. если у вас есть итерационное или предсказуемое поле его можно сформировать и скорость вывода уведичится
можно поподробнее? индексы сделаны на те поля по которым match делается я так понял что в аггрегациях skip всегда будет вносить задержку?
Дмитрий
Да. Всегда. Для моего скип - это инородное. Она сначала делает агрегацию, а потом ее пагинирует. А вот если в условия пгрегации засунуть к примеру инкриментальный ид - будет значительно быстрее. Тогда агрегация будет скажем с 0 до 10
Дмитрий
* монги / мое го
Дмитрий
Вообще готовые агрегации со скипом ведь тоже можно индексировать и хранить
Дмитрий
Или кешировать редисом
Дмитрий
Забудьте все что знали о реляции) агрегация - берет всегда весь массив документов. Дополнительная выборка - всегда + 1 операция
Ilya
ну вообще мне просто не понятно было почему project вобычном find не может нормально отфильтровать подмассив документов
Ilya
в find же скип быстро работает)
Yurii
https://dzone.com/articles/fast-paging-with-mongodb один из вариантов сделать быстрее скип - .find({'_id'> last_id})
Дмитрий
ну вообще мне просто не понятно было почему project вобычном find не может нормально отфильтровать подмассив документов
Может. Почему. Просто там два запроса по факту. Субдокументы - отдельная коллекция
Ilya
Может. Почему. Просто там два запроса по факту. Субдокументы - отдельная коллекция
Мы такую фишку сделали на функции js - типа сначала делаем запрос, а потом уже сам массив items фильтруем в js руками, и он работает очень быстро, но я хотел понять можно ли средствами самой монги обойтись без хранимых функций
yopp
Если вы хотите skip/limit по вложенным документам с условием по вложенным документам — быстро не будет.
Дмитрий
Ни какая это не отдельная коллекция
Разве? Я думал иначе. Киньтесь ссылкой про субдокументы. Как они устроены. Буду овен. Признателен
Ilya
Если вы хотите skip/limit по вложенным документам с условием по вложенным документам — быстро не будет.
стоп еще раз скип и лимит нужен по верхнему документу, по вложенным нужен только фильтр