yopp
да
yopp
если updateMany по всей коллекции то внутри каждого используйте своё значение _s
Alexander
yopp
что?
Alexander
yopp
не понимаю что вы имеете ввиду
Alexander
пошел проверю и отпишусь ;)
yopp
bulkWrite вам никаких гарантий не даёт
yopp
это сетевое мультиплексирование: собрать несколько запросов в один пакет
yopp
а в монге они выполняются точно так-же как несколько отдельных запросов
yopp
очень плохое название для этой фичи :(
Alexander
@dd_bb а есть какие-нибудь бест-практис для монги для версионирования изменений данных?
к примеру, есть article, через какое-то время текст поправили, но нужен доступ к предыдущему варианту. м?
yopp
http://www.askasya.com/post/trackversions/
Alexander
спасибо
Anonymous
Создать документ через upsert с телом { arr: {$push: [123]}} не получится, да? пишет MongoError: '$set' is empty.
Nick
{$push:{arr:[123]}
Anonymous
ещё один вопрос, если у меня хранится массив [{animal: String, paws: Int}], а мне нужно сделать push в него , я могу как-то дополнительно указывать, чттоб если animal такой есть, чтоб paws инткрементировался, а не добавлялся ещё один обьект?
Nick
посмотрите https://docs.mongodb.com/manual/reference/operator/update/positional-filtered/ и $inc
Nick
точно не помню, но вроде ваш сценрий можно реализовать
Nick
да там и апсерт есть
Anonymous
Сделал, существующие обновляет как надо, а вот новые не апсёртит😭😭😭
ZooList.updateOne({
zoo: req.params.zoo,
}, {
$inc: {
[`mammals.$[elem].paws`]: req.body.paws,
},
}, {
arrayFilters: [{ "elem.animal": req.body.animal }],
upsert: true,
});
Если animal не существует, то просто пишет, что nModified: 0
Nick
а вторые квадратные скобки вокруг mammals.$[elem].paws зачем7
Anonymous
Вообще у меня теперь непонятки, а как он вообще догадается, что именно я хочу upsert'нуть? Вроде же неочевидно совсем
Nick
текс а проверьте не появился ли каконйитьб док в базе только с этим полем?
Anonymous
Nick
т.е. вам нужно инкрементить только если чтото нашлось?
Nick
тогда апсерт выкидывайте
Anonymous
Nick
так если вы монугс используйте на кой вам это делать руками?
Nick
нашли док, поменяли как вам надо и сохранили
Anonymous
так думал можно в одну операцию, ясно что можно и в приложении описать все случаи)
А так придётся сначала проверить, есть ли док, если нет, то сделать создание, а вот пуш то всё равно не работает, значит и его руками проверять( База надёжнее как-то
Nick
вы видимо не понимаете суть работы со всякими одм, вы все должны делать через них. в обход делается только реально мега сложная какаято дичь
Nick
да
Nick
вы должны работать не с базой, а с монгусом, а если быть еще точнее с сущностями, а все связанное с изменениями берет на себя монгус
Anonymous
Ок, а в чём тут нюансы работы с одм, это просто апдейт на стороне приложения, такое и с нативным драйвером можно было замутить? Если работать с сущностью монгуса, то там просто вместо полей обьекта геттеры и сеттеры, в чём кардинальное отличие?
Nick
в уровне абстракции, вы работаете с объектами, а не с бд
Anonymous
Ну да, ещё раз, не могу понять: если я просто скачаю док из бд, переведу его в формат обьекта js, произведу операци обновления, а потом сохраню в бд (средствами нативного драйвера или ODM), в чём будет роль одм как абстракции? Управлять коннектом к бд?
Nick
не знаю внутрянок монгуса, но как минмум он предоставляет работу с объектом по схеме, которую обычный драйвер не гарантирует. Так же в особо интересных случаях избавялет от кучи бойлерплейта.
К сожалению вы смотрите на монгус не с правильной точки зрения, т.к. он заточне исключительно под монгу. но если взять чтонить из мира орм заточенное на sql базы то там вы вообще абстрагируетесь от того в какой базе хранится, хоть в распределенной, хоть в ембеддед, хоть в постгре, хоть в оракле. вплоть до разрабатываете на одном, а в проде все гоняется на другом
Anonymous
Gleb
Подскажите, как вернуть само свойство в mongo/mongoose?
Возвращает со всеми параметрами (видимо, с прототипа)
Gleb
CoreMongooseArray [
{ percent: { value: 44, enter: true },
_id: 5c7e84200853dd5bfdebf554,
campaignId: '5c7a952a39f1d6002e317028',
updated: 2019-03-05T14:15:17.748Z },
_path: 'campaigns',
toBSON: [Function: toBSON],
_atomics: {},
_parent: { percent: { value: 36, enter: false },
.........
Gleb
А в БД это массив объектов (первый элемент видно)
[{
percent: {},
_id,
campaignId
}]
Gleb
Вот мне нужно пройтись по этому массиву через .find()
λ
Подскажите как отсеять элементы у которых images пустой?
Пока выбираю так:
.aggregate([
{$limit: 5},
{
$lookup: {
from: 'images',
localField: '_id',
foreignField: 'articleId',
as: 'images'
}
}
])
Eugene
{$match: {images: {$ne: []}}}
λ
Оказалось проще чем казалось) Спасибо.
λ
Только вот не эффективно :)
λ
А можно как-то под запросы делать?
SELECT id FROM articles WHERE id NOT IN (SELECT DISTINCT articleId from images);
yopp
проще сделать в два запроса
λ
У меня images 6 лямов. даже distinct не влезает в 16МБ
Lev
@dd_bb change stream он ведь по времени отсортирован? Или может слать невпопад?
yopp
https://github.com/mongodb/specifications/blob/master/source/change-streams/change-streams.rst
Lev
Да чет... нету там ничего.
https://docs.mongodb.com/manual/reference/change-events/#dropdatabase-event
Тут вот про clusterTime есть но про порядок - ничего
Lev
https://docs.mongodb.com/manual/administration/change-streams-production-recommendations/#sharded-clusters
Это к sharded-clusters но все равно:
MongoDB guarantees the order of changes are preserved and change stream notifications can be safely interpreted in the order received.
Алишер Абдуллаев
Всем привет. Не подскажите пожалуйста , в монгодб сохранил следующее поля:
{
page: {
course: [{
title: { type: String, required: 'Title is required' },
category: { type: String, required: 'Category is required' }
}]
}
} - ну примерно так.
Теперь когда я делаю запрос с Постмана:
"params": {
"title": "Языковые курсы",
"category": "Немецкий"
}
на сервере функция выглядить так: await UserService.get(body.params); -->
возвращает пустой массив.
Алишер Абдуллаев
В общем , монгус сам в массиве находит данный запрос. Так как в бд course - это массив, а я отправляю только объект , норм ?
Andrey
ребят, а это нормальная практика retry-flow делать сначала retry на commit, и если ошибка не позволяет делать retry, то уже делать retry на всю транзакцию?
Andrey
меня просто while true в примерах немного сбивает, может ли быть кейс, когда транзакция будет без остановки фейлиться
Egor
Здравствуйте, а правда что монго очень чувствительна к версии? что лучше не делать монгодамп версией 2.х с сервера 3.х или наоборот?
λ
Сделал 2 отдельных запроса.
Дождался distinct, и потом вставил в
.find({_id: {$in: [ 1020180, 155808, … ]}, {_id: 1})
получил Error:
Converting from JavaScript to BSON failed: Object size 54267426 exceeds limit of 16793600 bytes
Bulat
Привет! Подскажите, плз, как найти количество групп после выполнения команды aggregate. Если вызвать count() после aggregate'a, то выпадает ошибка count is not a function
Nick
посмотрите тип полученного объекта и найдите у него соотвевующий метод
yopp
yopp
bson forward-compatible, а вот с backward-compatibility могут быть проблемы
yopp
т.е. из любой старой версии в любую новую вы дамп легко зальёте
yopp
а вот из новой в старую могут быть проблемы, которые вылезут в момент восстановления
yopp
к сожалению у bson всё очень плохо с «версионированием», тяжело сказать с какими типами могут быть прблемы
yopp
из головы, точно decimal128
yopp
и вероятно с некоторыми подтипами в binary
CyberPunk2050
Всем привет!
Коллеги подскажите столкнулся с ситуацией есть бэкапы шардов (консистентные) хочу восстановить их на единственный экземпляр монги, что бы вытащить допустим всего один документик. Как можно склеить бэкапы шардов в один? (тестирую бэкапы через утилиту Percona MongoDB Consistent Backups )
yopp
вливаете их в одну ноду и всё
yopp
но вы с перконой сами с собой останетесь