Vadim
https://docs.mongodb.com/v3.2/reference/connection-string/
Egor
Добрый день. Как можно ограничить используемую память монго версии 4 без ребута. Была поставлена без тюнинга и сожрало почти всю память (пару серверов монго+мускул)
Max
Монго и мускул на одном сервере?
𝕬𝖗𝖙𝖊𝖒
Люди, таков вот вопрос. У меня вылетает ошибка при использовании insert_one(): TypeError: 'Collection' object is not callables. If you meant to call the 'insert_one' method on a 'Database' object it is failing because no such method exists. По запросам в инете переделал в insert(). Но теперь он мне возвращает курсор, что мне не нужно. Ну а в том же интернете решается это insert_one. Замкнутый круг. Кто-то знает как решить?
pplcf
Монга не любит соседей. В доке где то было написано, что рекомендуется дать ей выделенную машину (ну или контейнер, как я понимаю)
pplcf
Подними правильно настроенные инстансы монги и включи монгу с соседями в реплика сет
pplcf
Потом мастер переключи на одну из правильных монг
𝕬𝖗𝖙𝖊𝖒
Потом мастер переключи на одну из правильных монг
У меня после всех этих манипуляций и insert не работает. Вернулся к изначальному коду, также и insert не работает.
𝕬𝖗𝖙𝖊𝖒
в ошибке все сказанно вроде, покажите код
db = MongoClient("mongodb://хххх:хххх@ds161397.mlab.com:61397/<имя_базы>") coll_users = db["users"] coll_users.insert({"id": "abc"})
Ilya
db = MongoClient("mongodb://хххх:хххх@ds161397.mlab.com:61397/<имя_базы>") тут db это не база у вас это клиент
Ilya
поэтому вы делаете запрос не в коллекции а в базе
Ilya
на что вам ошибка и указала
Ilya
client = MongoClient("mongodb://хххх:хххх@ds161397.mlab.com:61397/<имя_базы>") db = client["имя_базы"] coll_users = db["users"] coll_users.insert({"id": "abc"})
Ilya
как то так
Ilya
то есть на inser_one замените
Ilya
последнюю строку
Ilya
MongoClient возвращет именно объект клиента
Ilya
а не базы
𝕬𝖗𝖙𝖊𝖒
MongoClient возвращет именно объект клиента
Окей, спасибо, но я пришел к изначальной проблеме. Если я использую find мне возвращает курсор. Если использую find_one, то выходит ошибка авторизации.
Ilya
тут уже надо с авторизацие разбираться find действительно возвращает курсор, если вы попробуете по нему проитеррироваться то тоже скорее всего получите ту же самую ошибку
𝕬𝖗𝖙𝖊𝖒
тут уже надо с авторизацие разбираться find действительно возвращает курсор, если вы попробуете по нему проитеррироваться то тоже скорее всего получите ту же самую ошибку
Я знаю, поэтому всегда использовал find_one, но тут ошибка авторизации при то, что в попытке использовать find с авторизацией всё хорошо.
yopp
Добрый день. Как можно ограничить используемую память монго версии 4 без ребута. Была поставлена без тюнинга и сожрало почти всю память (пару серверов монго+мускул)
Без перезапуска никак. Но даже если вы ограничите размер кэша, это не ограничит выделение памяти под служебные структуры (снепшоты, соединения, буферы для агрегаций и сортировок и тд)
yopp
Как выше сказали, идея иметь несколько хранилищ на одном хосте не самая лучшая. Можете попробовать https://mongodb.com/atlas
Egor
Потом мастер переключи на одну из правильных монг
ну софтина умеет работать с репликасетом, сам же и толкал эту идею кодерам . так что ребут не был страшен, разве что пришлось ручками заново указывать кто праймари
Dmitry
Парни, подскажите плиз, я в Schema на добавление нового пользователя ставлю полям login и email unique: true Но все равно проходит запись в БД пользователей с одинаковыми login и email. Как сделать чтобы если уже есть пользователь с почтой xxx@xxx.ru, второй с такой же почтой зарегистрироваться не смог?
Vlad🍁
Делать проверку на существование пользователя в БД?
yopp
https://www.vldb.org/pvldb/vol12/p2071-schultz.pdf
Anton
всем 👋 подскажите такой момент: использование реплика-сета — это необходимая история для продакшена? если у меня бэкенд интернет-магазина запускается на одной машине одним докер-компоуз файлом это так сказать недальновидно? или покатит?
yopp
всем 👋 подскажите такой момент: использование реплика-сета — это необходимая история для продакшена? если у меня бэкенд интернет-магазина запускается на одной машине одним докер-компоуз файлом это так сказать недальновидно? или покатит?
Зависит от ваших требований. Если у вас есть верифицируемый резервные копии,и вам не страшны потери небольшого количества данных и несколько часов простоя, то и на одной одной ноде можно есть. Если есть более жесткие требования к SLA, то я предлагаю начать с Atlas: https://mongodb.com/atlas
Max
@dd_bb монговцы уже платить проценты должны вам за это)
yopp
Я над этим работаю ;)
Anton
Зависит от ваших требований. Если у вас есть верифицируемый резервные копии,и вам не страшны потери небольшого количества данных и несколько часов простоя, то и на одной одной ноде можно есть. Если есть более жесткие требования к SLA, то я предлагаю начать с Atlas: https://mongodb.com/atlas
Спасибо! И ещё такой момент, если я решил, что мне всё-таки нужны реплики, то девелопить на локальной машине мне как бы тоже нужно эмулируя, что нодов несколько (скажем, поднимать реплика-сет отдельным компоуз-файлом локально), чтобы не наткнуться на какие-то моменты расхождения между девелопментом под одну монгу и продакшеном с реплика-сетом? Или там разницы нет никакой, и драйвер сам этот момент под капотом разруливает?
yopp
Разницы почти никакой. Эмулировать не обязательно, есть mtools и там есть замечательный mlaunch который умеет поднимать хоть реплику, хоть шарды именно для локальной разработки.
yopp
А ещё есть бесплатный тариф в атласе на 512мб :)
yopp
Если бы ещё кто-то подружил mlaunch с докером было бы вообще отлично
𝕬𝖗𝖙𝖊𝖒
Ещё раз привет. Такой вот вопрос. Возникшие ранние ошибки решил обойти с помощью асинхронного motor. Но сейчас происходит вот такая вот вещь. При любом из вариантов запросов приведённых ниже получаю ошибку(также ниже).
𝕬𝖗𝖙𝖊𝖒
async def insert_db(message): async with await client.start_session() as s: data = await users(message) try: find_db(data) except: await coll_users.insert_one({"id":"0"}, session=s)
𝕬𝖗𝖙𝖊𝖒
async def insert_db(message): async with await client.start_session() as s: data = await users(message) try: find_db(data) except: await coll_users.insert_one(data, session=s) где дата = {"id": "0"}
𝕬𝖗𝖙𝖊𝖒
TypeError: document must be an instance of dict, bson.son.SON, bson.raw_bson.RawBSONDocument, or a type that inherits from collections.MutableMapping
𝕬𝖗𝖙𝖊𝖒
Каким образом решается?
Nick
Каким образом решается?
Чтением документации по вашему драйверу, там наверняка есть нормальные примеры использования
Anton
Разницы почти никакой. Эмулировать не обязательно, есть mtools и там есть замечательный mlaunch который умеет поднимать хоть реплику, хоть шарды именно для локальной разработки.
разница, как оказалось, всё-таки есть, потому что без реплика-сета нет и транзакций, насколько я понял 🙁 а атлас был бы хорошим выбором, если бы не 152-фз и вот это вот всё
Anton
всё равно спасибо 🙂
yopp
Транзакции и change stream, если они вам необходимы, потребуют реплики. Как и отладка write/read concern и read preference. При соблюдении ряда условий вы можете «копии» данных размещать за рубежом и даже их там обрабатывать
yopp
152 фз требует чтоб первичный сбор и хранение именно персональных данных были локализованы.
Anton
152 фз требует чтоб первичный сбор и хранение именно персональных данных были локализованы.
да, у меня тут паспортные данные, так что подходит под 152-фз. я уже поискал по этому чату, что вы часто у людей спрашиваете, а действительно ли им нужны транзакции и какие задачи они с их помощью решают.
yopp
И о каких объёмах речь?
Anton
У вас только паспортные данные? :)
Не только, емэйлы, телефоны, бэкенд для e-commerce/комиссионного магазина
Bro
вообщем есть коллекция 250m записей
Bro
там геоиндекс 2dsphere (почему-то он быстрее чем 2d)
Bro
запрос (все в радиусе 50км вокруг точки) возвращает где-то 500к записей
Bro
очень медленно
Bro
есть какие-то варианты уменьшить время запроса
Bro
?
yopp
уменьшить число возвращаемых записей
Bro
ну я сейчас думаю использовать maxDistance / minDistance чтобы разбить большие запросы не несколько мелких
Bro
и возвращать только то что нужно через project
Vladislav
Ребята, всем привет! вернусь к своему предыдущему вопросу (сейчас перешлю его еще раз). Вообще с hashed индексами почему-то это не работает. То есть я создаю индекс db.users.createIndex( { "sessions.session_id": "hashed"} ). А потом пытаюсь сделать выборку по конкретному session_id: db.users.find( {"sessions.session_id": "<SESSION_ID>"} ) - и результат 0 элементов! Но потом я добавил еще один обычный индекс (я так понимаю обычный=btree): db.users.createIndex( {"sessions.session_id": 1}) . Создался индекс, правда, с гигантским размером. И на нем FIND-запрос заработал корректно! Правда, btree-индекс мне не особо нужен, так как это поле я буду в основном матчить через EQUAL. Почему не работает HASH-индекс?
Vladislav
Привет, ребята! Есть такой вопрос по индексам: а MongoDB умеет индексировать по конкретным значениям в массивах объектов. Объясню что хочу: есть примерно такой документ в коллекции: { "_id": ObjectID("....."), "sessions": [ { "session_id": "e5ade208-dabc-11e9-a60f-0a580ae94561", // HASH INDEX "visit": 0 }, { "session_id": "d07a9526-dabc-11e9-a60f-0a580ae94561", // HASH INDEX "browser": "Mozilla" } ], "first_name": "Petr", "last_name": "Pavlov" } Так вот на session_id навесить индекс (HASH). С помощью которого можно было бы получить документ по указанному session_id и вытащить first_name и last_name. Можно ли это сделать в монге? А то по документации не очень понятно
Vladislav
MongoDB supports hashed indexes of any single field. The hashing function collapses embedded documents and computes the hash for the entire value, but does not support multi-key (i.e. arrays) indexes.
Ага. Я тоже обратил внимание на это в документации. Но после первого вопроса вы сказали, что hashed-индексы можно делать в моей ситуации. Вот и подумал, что я документацию не так понял 😃
yopp
я и не вспомнил, потому что hashed индекс не нужен
yopp
как быстро размазать по шарду сойдёт
yopp
в остальнмо если вам очень надо, вместо строки храните в binary.uuid(type=4)
yopp
либо самостоятельно считайте удобный для вас хеш
yopp
я уже вам говорил что разница только в том как формируются ключи для индексов
Vladislav
Да не, не особо нужно. Потому что по btree индексу вроде тоже быстро ищет)
yopp
а сколько у вас записей и какой размер индекса получился?
yopp
storage size
Vladislav
Я сейчас тестирую просто локально на компе у себя (win). Но добавил где-то 11m записей. Структура пока всего лишь чуть сложнее, чем которую я прислал в примере. Вся коллекция 6.7GB занимает. Не знаю включаются ли размеры индексов, смотрю через Compass, наверное включаются. А btree-индекс занимает: 782.6MB
yopp
db.coll.stats({«indexDetails»: 1}) и дальше в indexDetails найдите ваш индекс и и там wiredtiger.block-manager.file size in bytes
yopp
и дальше можно прикинуть размер записи с оверхедом поделив на 11м * среднее число элементов в массиве
Vladislav
Эх. что-то я не нахожу этого параметра) Но это нужно для того, чтоб вычислить, сколько одна запись будет занимать места в индексе в худшем случае?