Nick
под ваши задачи смотрите, разбираться можно долго и упорно
V
Ребят подскажите кто как автоматизирует монго deployment from scratch.
а то код deployment то легко уже делать а вот с базами слегка запутанее
интересен опыт каждого
Aleksandr
ㅤㅤㅤㅤㅤ
#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
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, если там есть совпадение по имени - убрать из выборки
👨🏼💻
как жто сделать жаваскриптом я понимаю, но хочется сделать на уровне базы
🖤
Давай ещё раз, вот исходные данные, получаемые в степе агрегейшена после лукапа:
[
{
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, которого надо дропнуть из выборки
не потеряв оригинальной формы данных ничего не придумалось. Aggregation stages выполняются на один доумент, и функций, позволяющих доступ из одной стадии к остальным документам я не нашёл. Задача интересная, буду рад, если поделитесь решением, когда найдёте.
👨🏼💻
Может вместо агрегации - mapReduce?
Юрий
ребят, хочу подключить mongoDB atlas и там хранить данные. а не в json в папке с проектом, там простая регистрация и вход.
что мне нужно что бы подключиться и хранить данные там? а то не совсем понимаю
Roman
привет!
как сделать distinct ключей (индексов) вложенного документа-массива в документы, отфильтровав только нужные значения этого массива?
pplcf
Aggregate
🖤
Может вместо агрегации - 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
👨🏼💻
На моей выборке работает, но выглядит ужасно. Пожалуйста, не баньте:
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
Сейчас проверим 🙂
👨🏼💻
На моей выборке работает, но выглядит ужасно. Пожалуйста, не баньте:
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
Валится вот тут: Command failed with error 2: 'unknown top level operator: $expr'
👨🏼💻
ВОт тут:
{$expr: {$eq: [{$indexOfArray: ['$chArray','$name']}, -1]}}
🖤
А версия монги какая ? Нписано, что это новый оператор в 3,6
👨🏼💻
mongodb-core: 3.0.8
🖤
Хз, как смотреть спецификацию версий, я проверял в монгошелле. Возможно, можно обойтись и без expr. Там я пытался сделать что-то вроде очевидного
{
$match:
{ name: { $nin: "$chArray" }}
}
Но получал ругань, что "$chArray" не Array.
В принципе, моя идея думаю понятна - анвинд с приклеиванием оригинала, потом сборка, чтоб каждый оригинал имел дополнительно массив всех имен детей. Потом взять только те, у которых имя оригинала не совпадает ни с одним именем в массиве имён детей.
👨🏼💻
В СКЛ как это сделать мне полностью понятно, но как это сделать в монге - это какая-то боль для меня
👨🏼💻
Я на это смотрю, и вообще тёмный лес
👨🏼💻
Хз, как смотреть спецификацию версий, я проверял в монгошелле. Возможно, можно обойтись и без expr. Там я пытался сделать что-то вроде очевидного
{
$match:
{ name: { $nin: "$chArray" }}
}
Но получал ругань, что "$chArray" не Array.
В принципе, моя идея думаю понятна - анвинд с приклеиванием оригинала, потом сборка, чтоб каждый оригинал имел дополнительно массив всех имен детей. Потом взять только те, у которых имя оригинала не совпадает ни с одним именем в массиве имён детей.
Кстати, вот так оно не работает. Но для $nin надо массив, а где-то там массив не понятно
👨🏼💻
Но я прошел до конца, и там тож не складывается, в итоге вот так:
👨🏼💻
👨🏼💻
🖤
🖤
🖤
вот что я подавал на вход
👨🏼💻
🖤
ок
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, в котором будет время получения сообщения, и отправлять сообщения всем, у кого оно больше какого-то порога
Nick
Anonymous
Привет. Всем. Подскажите туториал как 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?
Anonymous
Nick
на всякий спрошу, а как вы проверяете что не сохранилось?
Nick
и опредлено ли поле emailConfirmHash в схеме?
Nick
а как насчет добавит ьвыводов в консоль из .set(function setEmailHash() { ? оно хоть вызывается?
Anonymous
Nick
уже лучше, дебажим дальше, а вы как сетите поле emailHash ?
Anonymous
Nick
это не отменяет вопроса о том как вы сеттите emailHash