Ilya
я имелл ввиду как именно документ в массиве выглядит
Ilya
Oleg
Коллеги, подскажите. Удаление данных с помощью bulk вешает lock на базу ?
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
а он не подтянется при репликации?
Dmitry
твою мать
Yurii
если хочешь обновить только одно поле - {$set: {status: "admin"}}
Yurii
в противном случае, ты обновляешь весь документ на то, что передал вторым параметром
Dmitry
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
SvPupok
из головы вылетело именно как обьявлять возможность чтения, а readPreference - эт само собой
Bandikoot
Ilya
Всем добрый день, подскажите с таким вопросом:
Есть документ вида:
{
_id: ObjectID
name: string
....,
items: [
{
name: string
type: string
size: int
},
...
]
}
как видно у него есть массив вложенных документов items, в нем могут быть несколько тысяч.
как при выборке ограничить элементы в items?
на сайте монги советуют использовать аггрегации, но с ними проблема начинается в том что необходимо испольховать skip и limit, и в этом случае запрос начинает работать очень медленно
Javed
Ilya
в смысле вынести в коллекцию отдельную?
Javed
Ну да, где он имеет ещё одну поля создателя и хранить там ай ди его
Javed
Я не спец, тоже учусь
Yurii
Ilya
да пагинацию
Yurii
да пагинацию
и ты делаешь {$unwind: "items"}, а потом $skip и $limit?
Ilya
нет $unwind не пробывал, если его сделать и отфильровать то в результате будут только те items которые попали в условие?
Yurii
ну понятно, что skip и limit это уже твои настройки пагинации
Ilya
эээ дак что в этом случае дал unwind ?
Ilya
я наверно плохо сформулировал
Ilya
есть документ у которого в items тысячи вложенных документов,
мне надо вывести этот же документ но с чтобы в items остались только те корые удовлетворяют условию
Yurii
тогда вместо $unwind - https://docs.mongodb.com/manual/reference/operator/aggregation/slice/
Yurii
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. Индексы сделаны?
Дмитрий
В теории если зададите критерии - скорость будет выше.
Дмитрий
Т.е. если у вас есть итерационное или предсказуемое поле его можно сформировать и скорость вывода уведичится
Дмитрий
Да. Всегда. Для моего скип - это инородное. Она сначала делает агрегацию, а потом ее пагинирует. А вот если в условия пгрегации засунуть к примеру инкриментальный ид - будет значительно быстрее. Тогда агрегация будет скажем с 0 до 10
Дмитрий
* монги / мое го
Дмитрий
Вообще готовые агрегации со скипом ведь тоже можно индексировать и хранить
Дмитрий
Или кешировать редисом
Дмитрий
Забудьте все что знали о реляции) агрегация - берет всегда весь массив документов. Дополнительная выборка - всегда + 1 операция
Ilya
ну вообще мне просто не понятно было почему project вобычном find не может нормально отфильтровать подмассив документов
Ilya
в find же скип быстро работает)
Yurii
https://dzone.com/articles/fast-paging-with-mongodb
один из вариантов сделать быстрее скип -
.find({'_id'> last_id})
Дмитрий
Ilya
yopp
yopp
Если вы хотите skip/limit по вложенным документам с условием по вложенным документам — быстро не будет.
Ilya
yopp
yopp