fλüggåɘnk∂€čhiœßøλ∫ên
Указывай при создании документа свое значение "_id" : "id"
Aza 👁️
не понял
Anonymous
@Unreal strong lead junior frontend backender
Anonymous
Всем привет! Я недавно лишь стал изучать mongodb и как новичок хотел бы поинтересоваться у знатоков в чем отличие между updateOne(), findAndModify() и findOneAndUpdate()? Что лучше использовать в общем случае?
....
путевый api для приема крипты не подскажите ?
Anonymous
Advcash
Aza 👁️
помогите плез, соединяю две коллекции но не получается ((((
Aza 👁️
Aza 👁️
Aza 👁️
Aza 👁️
получаю пустой массив (((
Ilya
а шо не populate моньгусёвский?
Aza 👁️
хммм
Aza 👁️
не пробовал
Revival
Подскажите как решить банальную задачу. Есть коллекция Accounts, в каждом документе есть поле status, которое может быть READY или BUSY. Задача - получить все документы с status === READY, далее выбрать случайный документ с которым будем работать или просто взять первый документ, после чего изменить status на BUSY. Вопрос - как предотвратить ситуацию выбора одного и того же документа? (несколько программ могут выполнять один и тот же код)
Revival
ну за логикой выбирать тот который не BUSY
ну понятно что это будет выглядеть что-то вроде db.collection("accounts").find({ "status": "READY" }) // get random // update document status вопрос ведь в другом, как предотвратить выбор одного документа двумя программами? в данном случаи ведь сначала вытягиваются документы, после выбирается рандомный документ и.. лишь на этом этапе изменяется статус выбранного документа на BUSY
Ilya
ну понятно что это будет выглядеть что-то вроде db.collection("accounts").find({ "status": "READY" }) // get random // update document status вопрос ведь в другом, как предотвратить выбор одного документа двумя программами? в данном случаи ведь сначала вытягиваются документы, после выбирается рандомный документ и.. лишь на этом этапе изменяется статус выбранного документа на BUSY
В свое время я тоже задавался данным вопросом. Как взять из монги документ и изменить его, учитывая, что это транзакционная операция, и есть конкурирующий write? Есть такой оператор $sample: https://docs.mongodb.com/manual/reference/operator/aggregation/sample/ Берет N рандомных документов из коллекции. Учитывая, что find может кушать aggregation pipeline, его вполне можно туда впихнуть. Однако остается 1 серьезная проблема - нам необходим filter, чтобы скипнуть доки которые нам не подходят, и взять только те, которые удовлетворяют условиям. А проблема в том, что $sample должен идти в пайплайне обязательно первым, то есть перед ним впихнуть $match не получится. Идеально было бы так: collection.find([ {$match: { ... } }, { $sample: { size: 1 } } ]), но судя по всему, так не сработает.
Ilya
в качестве изощренного решения: запускаем транзакцию, считаем кол-во документов, подходящие под условия, и делаем запрос find().limit(1).skip(N), где N - рандомное число от 0 до кол-ва подсчитанных документов но я чет сомневаюсь, что это хороший вариант
Александр
Приветствую подскажите пожалуйста способ отчистки зависимых объектов в MongoDB? я ей пользуюсь уже 2 мес и пока никак не пойму как удалить зависимые документы из других коллекций. если коротко. есть несколько коллекций, в одной главная запись это юзер. она является родителем всех остальных. далее есть диалоги и месседжы допустим. это 2 отдельные коллекции, диалоги имеют привязку к юзеру прямую. а месседжи только знают о диалогах. задача при такой иерархии при удалении юзера чтобы происходило удаление всех зависимых данных. Слышал что у MongoEngine есть настройка для ReferenceField но как понял она работает только если я зливал данные через нее. а данные были залиты через Motor/ т.к. нужна асинхронщина... по итогу не уверен что этот вариант мне подойдет. а другого пока не нашел. Резюмируем. как удалить рекурсивно документы.?
Cloud
Приветствую подскажите пожалуйста способ отчистки зависимых объектов в MongoDB? я ей пользуюсь уже 2 мес и пока никак не пойму как удалить зависимые документы из других коллекций. если коротко. есть несколько коллекций, в одной главная запись это юзер. она является родителем всех остальных. далее есть диалоги и месседжы допустим. это 2 отдельные коллекции, диалоги имеют привязку к юзеру прямую. а месседжи только знают о диалогах. задача при такой иерархии при удалении юзера чтобы происходило удаление всех зависимых данных. Слышал что у MongoEngine есть настройка для ReferenceField но как понял она работает только если я зливал данные через нее. а данные были залиты через Motor/ т.к. нужна асинхронщина... по итогу не уверен что этот вариант мне подойдет. а другого пока не нашел. Резюмируем. как удалить рекурсивно документы.?
Ну как минимум, ты при "удалении юзера", можешь сначала найти все зависимые записи. А потом это все удалить
Александр
понял а в самой монге через консольку подобное провернуть вожможно? чтобы не городить кучу логики на питоне для описания всех коллекций их взаимосвязей и поиска ?
Cloud
Ну да, просто последовательно пишешь тебе нужные запросы, находишь id нужных записей и руками пишешь запросы на удаление
Александр
тааак я имел ввиду что-то более автоматизированное) например "найти все записи где... и удалить их" а в этом где будет так же цикличное удаление связанных данных ?
Александр
м. б. mongoose ? но там всеравно не автоматом
Ммм да что-то подобное... но чем больше получаю ответов тем больше понимаю неоибежности описания логики на питоне для поиска и удаления зависимостей...:) эх, ладно, будемс делать)
Александр
Спасибо за ответы!
Евгений
Всем привет! Подскажите для чего нужно использовать метод .exec при обращении к базе? Обращался через mongoose. Находил инфу, но везде по разному обьясняли и в итоге по сути ничего не понял)
Vlad
Добрый день! Подскажите, пожалуйста, можно ли без агрегаций решить такую задачу: элементы имеют такой вид (упрощенно) { "units" : [ { "id" : 1 }, { "id" : 2 } ] } мне нужно найти все записи, для которых массив всех их units.id входит в заданный массив. Пример: запись выше должна находится для заданого массива [1,2,3], но не должна для [1,3], потому что в нем нет 2-ки. Я уже пробовал разные комбинации $in, $all, $elemMatch, гуглил, но что-то никак. Хотя кажется, что задача довольно простая и должна решаться без агрегаций Upd. По видимому, решения через find нету (буду рад узнать, если все-таки есть), поэтому мы пока сделали через агрегации вот так db.apps.aggregate([{$match:{"units.id":{$in: [2,3] } } },{$project: {"units.id":1, uSubset:{$setIsSubset: ["$units.id", [2,3]]}}},{$match:{uSubset:true}},{$project:{uSubset:0, _id:0}}]) Upd2. @yarymil предложил замечательное решение без агрегаций!!! db.apps.find({ "units": { $not: { $elemMatch: { id: { $nin: [1,2,3] } } } } })
Alex
Добрый день. Подскажите как в pymongo выбрать все документы за месяц
Adatan
Добрый день. Подскажите как в pymongo выбрать все документы за месяц
Можно пройтись курсором по всей коллекции и, если есть, timestamp у документа то прямо по нему и сравнить, если нет, то достать timestamp из ObjectID и сравнить. (Это если прямо в лоб)
Nick
Добрый день. Подскажите как в pymongo выбрать все документы за месяц
обычная выборка find с указанием в поиске границ для даты с помощью $gte/$lt
Yaroslav
Добрый день! Подскажите, пожалуйста, можно ли без агрегаций решить такую задачу: элементы имеют такой вид (упрощенно) { "units" : [ { "id" : 1 }, { "id" : 2 } ] } мне нужно найти все записи, для которых массив всех их units.id входит в заданный массив. Пример: запись выше должна находится для заданого массива [1,2,3], но не должна для [1,3], потому что в нем нет 2-ки. Я уже пробовал разные комбинации $in, $all, $elemMatch, гуглил, но что-то никак. Хотя кажется, что задача довольно простая и должна решаться без агрегаций Upd. По видимому, решения через find нету (буду рад узнать, если все-таки есть), поэтому мы пока сделали через агрегации вот так db.apps.aggregate([{$match:{"units.id":{$in: [2,3] } } },{$project: {"units.id":1, uSubset:{$setIsSubset: ["$units.id", [2,3]]}}},{$match:{uSubset:true}},{$project:{uSubset:0, _id:0}}]) Upd2. @yarymil предложил замечательное решение без агрегаций!!! db.apps.find({ "units": { $not: { $elemMatch: { id: { $nin: [1,2,3] } } } } })
Доброй ночи, Думаю есть решение для Вашей задачи. db.apps.find({ "units": { $not: { $elemMatch: { id: { $nin: [1,2,3 } } } } }) массив [1,2,3] замените на нужный Вам.
Vlad
Доброй ночи, Думаю есть решение для Вашей задачи. db.apps.find({ "units": { $not: { $elemMatch: { id: { $nin: [1,2,3 } } } } }) массив [1,2,3] замените на нужный Вам.
Доброе утро! Супер!!! Спасибо большое!!! А как вы к этому решению пришли? Я думал про логическое отрицание, но не придумал, как его тут применить, а это просто замечательное решение, потому что с агрегациями мы по итогу подвисли (там кейс сложнее, чем в моем примере)
Yaroslav
Доброе утро! Супер!!! Спасибо большое!!! А как вы к этому решению пришли? Я думал про логическое отрицание, но не придумал, как его тут применить, а это просто замечательное решение, потому что с агрегациями мы по итогу подвисли (там кейс сложнее, чем в моем примере)
Я сам в таких случаях всегда применял агрегацию, благо даные позволяли. В даном случае решение через агрегацию тоже выглядело просто - с помощью $map создаем новый встроеный массив, элементы которого это поля id из изначального массива, дальше можно и $setIsSubset. Но стало интересно, можно ли при использовании find отфильтровать коллекцию применяя условие ко всем элементам встроеного массива, а не к хотя бы одному, как это работает по умолчанию. Когда игрался с $elemMatch получил отрицательно множество (хотя напрямую, без $elemMatch отрицательное множество получить нельзя). Дальше просто - отрицание отрицания. Проверил работает ли $not для $elemMatch, оказалось работает.
Alex
@Nick, @Adatan спасибо.
Kос
Привет, у меня после группировки через aggregate получается вот такой список объектов. Можно ли как-то (через project или еще как) превратить в объект вида {'значение из _id': 'значение из count'} ?
Kос
Те что-то на подобии такого
Yaroslav
Круто! Я только не понял, что такое отрицательное множество
возможно это не совсем коректный термин - русский язык не мой родной да и теорию множеств я изучал 20 лет назад. под отрицателным множеством я имел ввиду подмножество документов, которое в объединении с искомым подмножеством (искомой выборкой) дает полное множество (всю коллекцию). при этом не пересекается с искомым подмножеством.
Yaroslav
я думаю что скорость find и aggregate не будет существенно отличатся в даном (и не только) случае. хотя запрос эстетически выглядит лучше через find. но в тех редкий случаях, когда нужно обойти ограничения aggregate, возможно такое решение кому-то и пригодится.
jrm
народ подскажите пжл , вот мой метод для добавление товара в категорию , но он добавляет id товара , хотя я передаю объект с id и name товара , это так и должно быть или я передаю не правильно ?
Vlad
я думаю что скорость find и aggregate не будет существенно отличатся в даном (и не только) случае. хотя запрос эстетически выглядит лучше через find. но в тех редкий случаях, когда нужно обойти ограничения aggregate, возможно такое решение кому-то и пригодится.
Дело еще в разных операторах. Например, мы юзаем ArrayFilters в find и только для нужного элемента вложенного списка делаем вот эту проверку по units, а как сделать тоже самое в aggregate - так и не разобрались до конца. Пробовали сделать $project с $filter в нем, но как-то докрутили. Так что вашему решение очень помогло👍👍
Дмитрий
всем привет, подскажите, а никто не сталкивался с проблемой, что невозможно подключиться к базе монгодб черезе клиент в случае переноса на нестандартный порт? если да, то есть решение?
Valeri
что в логах пишется?
Дмитрий
да, конечно.
Дмитрий
при этом на сервере запускается без вопросов
Yoda
при этом на сервере запускается без вопросов
первая ссылка из гугла, но суть понятна: https://medium.com/@Hardy2151/how-to-connect-to-your-remote-mongodb-server-68725a8e53f
Semyon V
друзья, а есть какой-то рекомендуемый способ подписки на получение новых записи через nodejs? не пойму пока почему, но получение новых записей после указанной ( используя $gt ) иногда теряет часть данных при получении
Valeri
айпи в конфиге прописаны, порт прописан
Если допустить, что со стороны mongodb все в порядке, то смотреть нужно в сторону системы и различных сетевых препятствий, о которых нам ничего из Вашего вопроса не ясно. Например, выше была предоставлена ссылка с описанием как сделать для ubuntu на aws. И там же говорится и показывается, что этот нестандартный порт нужно открыть. Поэтому Вам и задаются наводящие вопросы куда можно подебажить - какая ОС? Что с фаерволом? И если редхатовские, то что с селинуксом?
Valeri
Ubuntu 18, firewall выключен, порт открыт
У mongodb есть логи и в системе есть логи, что они говорят?
Yoda
https://pastecode.ru/0d0caa/
Ну бляха муха!
Yoda
И чего не работает, странно как-то 😜😂
Дмитрий
Ну бляха муха!
в логе вижу, в файле конфига прописано правильно
Yoda
в логе вижу, в файле конфига прописано правильно
Ну направление тебе должно быть понятно почему не работает.
Дмитрий
bindIp: "127.0.0.1"
https://pastecode.ru/0b44fe/
Дмитрий
Ну направление тебе должно быть понятно почему не работает.
я как бы понимаю, что стучится на локал, но в конфиге то указано правильно
Дмитрий
To bind to all IPv4 addresses, you can specify the bind ip address of 0.0.0.0
ставлю 0.0.0.0 меняю на любой порт, вопросов нет, всё работает как часы, как же быть, если хочу отфильтровать на локал хост и ещё на несколько айпи? проблема в том, что бд на стандартном порту была взломана, слита и удалена через 24 часа после установки (как почитал в гугле в связи с какой-то дырой на этом порту что ли)
Elinka22
ss -nlpt | grep mongo
Elinka22
потом ps -aux | grep PID
Elinka22
где PID - вывод ID процесса из предыдущей команды
Дмитрий
mongodb 1675 0.3 3.6 1023904 72884 ? Ssl 18:06 0:28 /usr/bin/mongod --unixSocketPrefix=/run/mongodb --config /etc/mongodb.conf root 13776 0.0 0.0 13140 988 pts/0 S+ 20:09 0:00 grep 1675
Дмитрий
Ну у меня и vesta cp стоит сейчас, спасёт ли меня фильтрация через firewall провайдера или vesta cp от такого рода атак? т.е. оставлю в конфиге 0.0.0.0 а в firewall установлю айпи с которых даю доступ?
Дмитрий
не хочется просто смотреть горло через задний проход, хочется сделать нормально 1 раз, научится и больше не вспоминать о такой проблеме)
Дмитрий
Не знаю как правильно - у меня в контейнерах все 😜
Моя твоя не понимать) Решение через фильтрацию айпи фпйерволом хостера/cp -адекватное или несовсем?)