fλüggåɘnk∂€čhiœßøλ∫ên
Указывай при создании документа свое значение "_id" : "id"
Aza 👁️
не понял
Anonymous
@Unreal strong lead junior frontend backender
Aza 👁️
Anonymous
Всем привет! Я недавно лишь стал изучать mongodb и как новичок хотел бы поинтересоваться у знатоков в чем отличие между updateOne(), findAndModify() и findOneAndUpdate()? Что лучше использовать в общем случае?
....
путевый api для приема крипты не подскажите ?
Anonymous
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 до кол-ва подсчитанных документов
но я чет сомневаюсь, что это хороший вариант
Alexander
Александр
Приветствую подскажите пожалуйста способ отчистки зависимых объектов в MongoDB? я ей пользуюсь уже 2 мес и пока никак не пойму как удалить зависимые документы из других коллекций.
если коротко. есть несколько коллекций, в одной главная запись это юзер. она является родителем всех остальных.
далее есть диалоги и месседжы допустим. это 2 отдельные коллекции, диалоги имеют привязку к юзеру прямую. а месседжи только знают о диалогах. задача при такой иерархии при удалении юзера чтобы происходило удаление всех зависимых данных.
Слышал что у MongoEngine есть настройка для ReferenceField но как понял она работает только если я зливал данные через нее. а данные были залиты через Motor/ т.к. нужна асинхронщина... по итогу не уверен что этот вариант мне подойдет. а другого пока не нашел.
Резюмируем. как удалить рекурсивно документы.?
Cloud
Александр
понял а в самой монге через консольку подобное провернуть вожможно? чтобы не городить кучу логики на питоне для описания всех коллекций их взаимосвязей и поиска ?
Cloud
Ну да, просто последовательно пишешь тебе нужные запросы, находишь id нужных записей
и руками пишешь запросы на удаление
Александр
тааак я имел ввиду что-то более автоматизированное) например "найти все записи где... и удалить их" а в этом где будет так же цикличное удаление связанных данных ?
Roman
Александр
м. б. 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
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ос
Те что-то на подобии такого
Vlad
Yaroslav
Круто! Я только не понял, что такое отрицательное множество
возможно это не совсем коректный термин - русский язык не мой родной да и теорию множеств я изучал 20 лет назад.
под отрицателным множеством я имел ввиду подмножество документов, которое в объединении с искомым подмножеством (искомой выборкой) дает полное множество (всю коллекцию). при этом не пересекается с искомым подмножеством.
Vlad
Yaroslav
я думаю что скорость find и aggregate не будет существенно отличатся в даном (и не только) случае. хотя запрос эстетически выглядит лучше через find.
но в тех редкий случаях, когда нужно обойти ограничения aggregate, возможно такое решение кому-то и пригодится.
jrm
народ подскажите пжл , вот мой метод для добавление товара в категорию , но он добавляет id товара , хотя я передаю объект с id и name товара , это так и должно быть или я передаю не правильно ?
Дмитрий
всем привет, подскажите, а никто не сталкивался с проблемой, что невозможно подключиться к базе монгодб черезе клиент в случае переноса на нестандартный порт? если да, то есть решение?
Valeri
Valeri
что в логах пишется?
Дмитрий
Дмитрий
при этом на сервере запускается без вопросов
Дмитрий
Semyon V
друзья, а есть какой-то рекомендуемый способ подписки на получение новых записи через nodejs? не пойму пока почему, но получение новых записей после указанной ( используя $gt ) иногда теряет часть данных при получении
Valeri
айпи в конфиге прописаны, порт прописан
Если допустить, что со стороны mongodb все в порядке, то смотреть нужно в сторону системы и различных сетевых препятствий, о которых нам ничего из Вашего вопроса не ясно.
Например, выше была предоставлена ссылка с описанием как сделать для ubuntu на aws. И там же говорится и показывается, что этот нестандартный порт нужно открыть.
Поэтому Вам и задаются наводящие вопросы куда можно подебажить - какая ОС? Что с фаерволом? И если редхатовские, то что с селинуксом?
Дмитрий
Дмитрий
Yoda
Yoda
Yoda
И чего не работает, странно как-то 😜😂
Дмитрий
Ну бляха муха!
в логе вижу, в файле конфига прописано правильно
Дмитрий
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
Yoda
Дмитрий
Ну у меня и vesta cp стоит сейчас, спасёт ли меня фильтрация через firewall провайдера или vesta cp от такого рода атак? т.е. оставлю в конфиге 0.0.0.0 а в firewall установлю айпи с которых даю доступ?
Дмитрий
не хочется просто смотреть горло через задний проход, хочется сделать нормально 1 раз, научится и больше не вспоминать о такой проблеме)
Yoda
Yoda