Nick
под ваши задачи смотрите, разбираться можно долго и упорно
V
Ребят подскажите кто как автоматизирует монго deployment from scratch. а то код deployment то легко уже делать а вот с базами слегка запутанее интересен опыт каждого
V
А что именно нужно деплоить в базу?
не сами кластера, и создать юзеров и базу. грубо говоря как в atlas. заказал базу она где-то развернулась юзера создала и так далее
yopp
Долго вообще mongodb осваивается? CRUD с коллекциями достаточно или что еще почитать/посмотреть?
Концептуально за неделю-две, на детали можно потратить всю жизнь. https://university.mongodb.com очень хороший старт
ㅤㅤㅤㅤㅤ
#ask In mongodb can mongodb join 3 (three) tables?
s0menickname
s0menickname
did you mean collections?
ㅤㅤㅤㅤㅤ
Anonymous
Yes collections
Yes, it can (in some way), but you definitely shouldn't do that. While in mongo it's recommended to distinguish one-to-one, one-to-some and one-to-many relations, you should better prefer embedding for first two relations. This article will probably clear that point for you
Anonymous
Привет всем, подскажите пожалуйста, как в mongoose middleware на запрос findOneAndUpdate получить update doc , и модифицировать его? На this получаю query и вроде вижу поле _update, но не уверен, что его можно менять. UPD: поменял его, работает. Если кто-то подскажет, как делать подобные вещи правильно, буду рад.
Dmytro
Здраствуйте все
Dmytro
как работает позиционный оператор не могу понять
Dmytro
$
Petro
Использую mongoDb Atlas, вопрос, какие права нужны чтобы я мог смотреть в колекцию system Query failed with error code 8000 and error message 'user is not allowed to do action [find] on Получаю такой ответ
👨🏼‍💻
Привет! Хелп! Очень надо, а то я уже афигиваю, мысли закончились. Есть агрегейшн, но 2 степе возвращает уже то что мне надо, осталось отфильстровать: [ { name: ‘vasyl’, children: [{name: ‘ivan’},{name: ‘nikita’}] }, { name: ‘nikita’, children: [{name: ‘petro’}] } ] Суть в том, что мне надо проверить каждый object.name, и если он есть в children.name любого из объектов, то скипнуть его. Тоесть вернуть должно: [{ name: ‘vasyl’, children: [{name: ‘ivan’},{name: ‘nikita’}] }]
👨🏼‍💻
Вариант, где нет чилдренов не вариант
👨🏼‍💻
Нет идей?
Kool
в итоге readAndWriteAnyDatabase пока дал
🖤
Нет идей?
Что-то близкое накидал: db.test.aggregate([{ $unwind: "$children" }, { $group: { _id: 1, name: { $push: "$name" }, children: { $push: "$children.name" } } }, { $project : {uniq: {$setDifference: ["$name", "$children"]}} }]).pretty() Типа вернёт массив имён обьектов, которые ничьи дети.
🖤
не то, что не подходит, но всё равно спасибо
Нужно прям именно обьекты вернуть?
👨🏼‍💻
Давай ещё раз, вот исходные данные, получаемые в степе агрегейшена после лукапа: [ { name: 'vasya', children: [{name: 'petya'}, {name: 'kolya'}] }, { name: 'sasha', children: [{name: 'alex'}, {name: 'kolya'}] }, { name: 'alex', children: [] } ] А вернуться должно: [ { name: 'vasya', children: [{name: 'petya'}, {name: 'kolya'}] }, { name: 'sasha', children: [{name: 'alex'}, {name: 'kolya'}] } ] Тоесть, у пэрэнта sasha есть чайлд alex, которого надо дропнуть из выборки
👨🏼‍💻
Надо взять имя каждого объекта, и пройтись по остальным object.child, если там есть совпадение по имени - убрать из выборки
👨🏼‍💻
как жто сделать жаваскриптом я понимаю, но хочется сделать на уровне базы
👨🏼‍💻
Может вместо агрегации - mapReduce?
Юрий
ребят, хочу подключить mongoDB atlas и там хранить данные. а не в json в папке с проектом, там простая регистрация и вход. что мне нужно что бы подключиться и хранить данные там? а то не совсем понимаю
Roman
привет! как сделать distinct ключей (индексов) вложенного документа-массива в документы, отфильтровав только нужные значения этого массива?
pplcf
Aggregate
yopp
ребят, хочу подключить mongoDB atlas и там хранить данные. а не в json в папке с проектом, там простая регистрация и вход. что мне нужно что бы подключиться и хранить данные там? а то не совсем понимаю
Конкретно с Atlas можно начать отсюда: https://docs.atlas.mongodb.com/getting-started/ Если хочется разобраться с монгой, то вот отсюда https://docs.mongodb.com/manual/introduction/ или отсюда https://university.mongodb.com/courses/M001/about
🖤
Может вместо агрегации - mapReduce?
На моей выборке работает, но выглядит ужасно. Пожалуйста, не баньте: db.test.aggregate([{$addFields:{originalName: "$name", originalChildren: "$children"}},{ $unwind: "$children" }, {"$group": { _id: 1, docs: { $push: { name: "$originalName", children: "$originalChildren" } }, children: {$push: "$children.name"} }},{$unwind: "$docs"} , {$project:{ _id: 0, name: "$docs.name", children: "$docs.children", chArray: "$children" }}, {$match: { $expr: {$eq: [{$indexOfArray: ["$chArray","$name"]}, -1]} }}, //Операции ниже чтоб убрать дубликаты из выборки {$project: { name: "$name", children:"$children" }}, {$group: { _id: 0, result: { $addToSet: { name: "$name", children:"$children" } } }}, {$unwind: "$result"},{$replaceRoot: {newRoot: "$result"}} ]).pretty() UPD: Добавил replaceRoot
👨🏼‍💻
ВОт тут: {$expr: {$eq: [{$indexOfArray: ['$chArray','$name']}, -1]}}
🖤
А версия монги какая ? Нписано, что это новый оператор в 3,6
👨🏼‍💻
mongodb-core: 3.0.8
🖤
Хз, как смотреть спецификацию версий, я проверял в монгошелле. Возможно, можно обойтись и без expr. Там я пытался сделать что-то вроде очевидного { $match: { name: { $nin: "$chArray" }} } Но получал ругань, что "$chArray" не Array. В принципе, моя идея думаю понятна - анвинд с приклеиванием оригинала, потом сборка, чтоб каждый оригинал имел дополнительно массив всех имен детей. Потом взять только те, у которых имя оригинала не совпадает ни с одним именем в массиве имён детей.
👨🏼‍💻
В СКЛ как это сделать мне полностью понятно, но как это сделать в монге - это какая-то боль для меня
👨🏼‍💻
Я на это смотрю, и вообще тёмный лес
👨🏼‍💻
Но я прошел до конца, и там тож не складывается, в итоге вот так:
👨🏼‍💻
🖤
Кстати, вот так оно не работает. Но для $nin надо массив, а где-то там массив не понятно
дык формально то chArray - массив, просто nin - это не aggregation operator, и ,видимо, потому не поддерживает такое обращение.
🖤
🖤
вот что я подавал на вход
🖤
ок
Yuri
Привет. Такой вопрос. Есть коллекция пользователей, в коллекции несколько миллионов документов {id:'...', name: '...'}. Надо разослать им сообщения, при этом надо знать кому мы уже отправили. Какой более подходящий вариант: 1. Дополнить документы дополнительным свойством, которое показывает что пользователь получил сообщение. 2. Создать дополнительную коллекцию в которую добавить тех, кто получил сообщение и отправлять сообщения только тем, кого в этой новой коллекции нет? 3. Удалять из первой коллекции тех, кто получил сообщение и добавлять их в новую коллекцию получивших сообщение.
Yuri
или ни один не подходит?
Nick
Привет. Такой вопрос. Есть коллекция пользователей, в коллекции несколько миллионов документов {id:'...', name: '...'}. Надо разослать им сообщения, при этом надо знать кому мы уже отправили. Какой более подходящий вариант: 1. Дополнить документы дополнительным свойством, которое показывает что пользователь получил сообщение. 2. Создать дополнительную коллекцию в которую добавить тех, кто получил сообщение и отправлять сообщения только тем, кого в этой новой коллекции нет? 3. Удалять из первой коллекции тех, кто получил сообщение и добавлять их в новую коллекцию получивших сообщение.
на несколько миллионов - если операция разовая и нет необходимости сохранить данные в коллекции, то 3 вариант очень даже ничего. Преимущество исключительно, если требуется именно все доки пройти. Если же де есть некоторые фильтры или нужно сохранить исходную коллекцию для работы, то первый вариант имеет премущество в случае если операция разовая или флаг будет означать, что дальше ничего делать не нужно. Тут еще момент, что потребуется проиндексировать поле с флагом и обязательно не спарс, иначе индекс будет зря построен. 2 вариант допустим когда у вас планируется в будущем множество отправок и нет желания захламлять основную коллекцию, например предновогодня расслка поздравления - это не требуется какихто требований на то как быстро закончится, но после НГ эти флаги уже абсолютно бесполезны и вместо удаления флагов будет проще дропнуть коллекцию
Yuri
кстати да, рассылка будет не разовая и она не должна происходить чаще, чем N раз в месяц например. То есть сервис работает, мы отправляем ему запрос на рассылку пользователям и если по каким-то причинам у нас сервис упал, то при возобновлении работы он не должен рассылать тем, кому уже отправил
Yuri
вот и получается, что если у нас 5млн пользователей и сервис упал, когда уже разослал 4.9млн, то получается нам надо проходить снова по всем документам в коллекции
Yuri
Неясно должна ли сохраняться первоначальная коллекция в изначальном виде, но скорее всего да. В таком случае если создавать новую коллекцию с получившими рассылку пользователями, то потребуется в два раза больше места.
Yuri
вообще мысль сделать дополнительное поле в пользователях last_notification, в котором будет время получения сообщения, и отправлять сообщения всем, у кого оно больше какого-то порога
Anonymous
Привет. Всем. Подскажите туториал как mongo реализовать подтверждение почты на koa, mongo.
Nick
Привет. Всем. Подскажите туториал как mongo реализовать подтверждение почты на koa, mongo.
это бизнес задача и она особо не привязана ни к монге ни к коа, сначала выстройте бизнес процесс, потом уже реализовывайте на чем хотите
Anonymous
это бизнес задача и она особо не привязана ни к монге ни к коа, сначала выстройте бизнес процесс, потом уже реализовывайте на чем хотите
У меня есть сохранение хэша пароля, и соли при регистрации. Я подобный образом пытаюсь реализовать создание хэша для email. Но хэш для email не сохраняется. Подскажите в чем может быть дело. userSchema.virtual('emailHash') .set(function setEmailHash() { this.emailConfirmHash = crypto.pbkdf2Sync( 'password', crypto.randomBytes(config.get('crypto.hash.length')).toString('base64'), config.get('crypto.hash.iterations'), config.get('crypto.hash.length'), 'sha512' ).toString('base64'); });
Nick
а оно должно сохраняться?
Nick
я прост на ноде не спец, но вы пробовали просто сохранять значения испод виртуал?
Anonymous
Да. У меня пароль так сохраняется...
Anonymous
Сейчас чекну чтобы не быть голословным
Nick
ну и норм, а что еще должно сохраняться?
Nick
emailConfirmHash?
Nick
на всякий спрошу, а как вы проверяете что не сохранилось?
Nick
и опредлено ли поле emailConfirmHash в схеме?
Anonymous
на всякий спрошу, а как вы проверяете что не сохранилось?
emailConfirmHash в схеме есть. Я смотрю в консоли, что не сохранилось поле, пробовал делать поле emailconfirmHash обязательным, кидает ошибку, что поле пустое.
Nick
а как насчет добавит ьвыводов в консоль из .set(function setEmailHash() { ? оно хоть вызывается?
Nick
уже лучше, дебажим дальше, а вы как сетите поле emailHash ?
Nick
это не отменяет вопроса о том как вы сеттите emailHash