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
Потом мастер переключи на одну из правильных монг
Ilya
𝕬𝖗𝖙𝖊𝖒
в ошибке все сказанно вроде, покажите код
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
а не базы
Ilya
тут уже надо с авторизацие разбираться find действительно возвращает курсор, если вы попробуете по нему проитеррироваться то тоже скорее всего получите ту же самую ошибку
𝕬𝖗𝖙𝖊𝖒
Egor
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
всем 👋 подскажите такой момент: использование реплика-сета — это необходимая история для продакшена? если у меня бэкенд интернет-магазина запускается на одной машине одним докер-компоуз файлом это так сказать недальновидно? или покатит?
Max
@dd_bb монговцы уже платить проценты должны вам за это)
yopp
Я над этим работаю ;)
Anton
Зависит от ваших требований. Если у вас есть верифицируемый резервные копии,и вам не страшны потери небольшого количества данных и несколько часов простоя, то и на одной одной ноде можно есть.
Если есть более жесткие требования к SLA, то я предлагаю начать с Atlas: https://mongodb.com/atlas
Спасибо! И ещё такой момент, если я решил, что мне всё-таки нужны реплики, то девелопить на локальной машине мне как бы тоже нужно эмулируя, что нодов несколько (скажем, поднимать реплика-сет отдельным компоуз-файлом локально), чтобы не наткнуться на какие-то моменты расхождения между девелопментом под одну монгу и продакшеном с реплика-сетом? Или там разницы нет никакой, и драйвер сам этот момент под капотом разруливает?
yopp
Разницы почти никакой. Эмулировать не обязательно, есть mtools и там есть замечательный mlaunch который умеет поднимать хоть реплику, хоть шарды именно для локальной разработки.
yopp
А ещё есть бесплатный тариф в атласе на 512мб :)
yopp
Anton
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
Anton
всё равно спасибо 🙂
yopp
Транзакции и change stream, если они вам необходимы, потребуют реплики. Как и отладка write/read concern и read preference.
При соблюдении ряда условий вы можете «копии» данных размещать за рубежом и даже их там обрабатывать
yopp
152 фз требует чтоб первичный сбор и хранение именно персональных данных были локализованы.
yopp
yopp
И о каких объёмах речь?
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. Можно ли это сделать в монге? А то по документации не очень понятно
yopp
Vladislav
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
Эх. что-то я не нахожу этого параметра) Но это нужно для того, чтоб вычислить, сколько одна запись будет занимать места в индексе в худшем случае?