Ответы пользователя по тегу MongoDB
  • Как в монго добавить коллекции из бэкапа к существующим?

    @lega
    Не очень хороший вариант, но можно попробовать сделать так:
    1) Сделать mongodump активной БД
    2) Восстановить бекап в "пустую БД"
    3) Сделать уникальный индекс по title
    4) Сделать mongorestore активной БД в эту базу
    Ответ написан
    Комментировать
  • Как организовать быстрый поиск по 3 млрд документов?

    @lega
    Грубо говоря, это список ключевых запросов пользователей ПС, из которых нужно выбрать те, в которые входит, например, слово "скачать".
    Если список ключевых слов не большой то можно сделать индексированный массив в документах и туда помещать эти ключевые слова (или их идентификаторы).
    В противном случае использовать sphinx/elasticsearch. Можно так же использовать text index из mongoDB, но он мне показался через чур прожорливым.

    попробовал сделать выборку через Matches
    При этом происходит перебор и проверка всех документов, поэтому это так долго.
    Ответ написан
    Комментировать
  • Как оптимизировать mongo под нагрузки?

    @lega
    Индекс по полю title есть? db.articles.ensureIndex({title: 1})

    title:'крым'
    Это точное значение поля, или вы хотите сделать поиск по части названия (полнотекстовый поиск)?
    Ответ написан
    Комментировать
  • Почему MongoDB может не видеть записи после определенной даты?

    @lega
    Только что заметил, у вас индекс по "create_date", а сортировку вы делаете по "create_time".
    При определенном (большом) количестве документов без сортировки монга не должна выдавать результат вообще в целях оптимизации, должна выдавать ошибку (зависит от версии).

    Предыдущий ответ: Попробуйте сделать dump/restore в другую базу, или db.repairDatabase, возможно база повреждена.
    Ответ написан
  • Как получить часть документа в монго?

    @lega
    Как вытащить только нулевой элемент массива books?

    Часть массива (или один элемент) можно достать с помощью $slice

    как вытащить значение поля year?

    db.col.find({}, {'books.year': 1}) - таким образом он должен выдать поле year (но по всем элементам массива).

    В случае если вам массив не особо нужен, то можно использовать словарь вместо него с ключами 0, 1, 2, 3...
    Тогда запрос будет типа такого: db.col.find({}, {'books.0.year': 1})
    Ответ написан
  • Как лучше хранить комментарии к посту в mongodb ?

    @lega
    Это зависит от того как бы будете их использовать (выводить).
    Если вы будете их все отображать только вместе с документом, тогда ваш вариант подходит т.к. одним запросом вы получаете и пости и комменты.
    Если Вам нужно использовать комментарии где-то ещё: последние 5 комментов, топ комментов, агрегация по комментам, или если Вам нужно где-то ссылаться на конкретные комменты - то есть смысл хранить их в отдельной коллекции (и кешировать пост чуть что).
    Ответ написан
    Комментировать
  • Как объединить коллекции(1Гб в день) с серверов сбора данных на главный сервер(бэкап)?

    @lega
    Перекачать данные можно через mongodump -> mongorestore, при этом на конечном сервере данные добавятся (при условии что не будет коллизий по _id). Так же можно попробовать команду db.copyDatabase.
    Через ssh можно сделать тунель, и делать дамп сразу на локальную машину.

    Хотя для автоматического сбора я бы сделал авторизацию по ключам и положил скрипт в cron, что-б он сам авторизовался и делал dump/restore. По пути можно сделать быстрое сжатие через gzip, что-б данные быстрее перекачались.

    Например что-то типа этого, делает удаленно дамп, жмет, перекачивает на локальную машину, распаковывает и делает restore.
    ssh -p 1022 server "cd /tmp/; rm -rf /tmp/dump.tbz2 /tmp/dump/; mongodump -d database; tar -cjf dump.tbz2 dump"
    	rm -rf /tmp/dump/
    	scp -P 1022 server:/tmp/dump.tbz2 /tmp/
    	cd /tmp/; tar -xjf dump.tbz2; mongorestore

    Само сжатие можно делать "на ходу" без создания файла.
    Ответ написан
    Комментировать
  • Mongodb возвращает float вместо int. Как исправить?

    @lega
    MongoDB возвращает то что вы записали, если вы запишите int через pymongo то и вернется int, если писать из js-консоли, то нужно "привести" число к int с помощью NumberInt или NumberLong.
    Ответ написан
    Комментировать
  • Сортировка в MongoDB?

    @lega
    Хранить репосты как отдельные документы (с ссылкой на оригинал если нужно), тогда и индекс и запрос будет простой.
    Ответ написан
    Комментировать
  • Помогитe с запросом группирования и суммирования в MongoDB?

    @lega
    Можно сделать 2 простых запроса: find({ from:"email" }).count() и find({ to:"email" }).count()
    А лучше, в "профиле email/пользователя" хранить счетчик входящих/исходящих.
    Ответ написан
    Комментировать
  • SQL или NOSQL для хранения и анализа логов действий игроков. На чем лучше организовать бд аналитики?

    @lega
    Многое зависит от отчетов. Например для вашей задачи хранить сырые данные вообще не нужно.

    Если отчеты ещё не определены или все же нужны сырые данные, то можно сделать партиционирование, например складывать все логи по одному игроку за один день в один документ в бинарном виде (time_delta, action) при этом зажать в gzip/zlib/...
    В итоге из 500Гб может получится 5Гб, а скорость вырастет за счет легких индексов и меньшего кол-ва передаваемых данных/документов. - недавно делал подобное.

    Так же можете сбросить userFlag в 0 для коллекции - сэкономите памяти, при этом монга не будет делать доп. резеривирования в каждом документе.
    Ответ написан
    1 комментарий
  • Unique или null для поля. Возможно ли такое в mongo?

    @lega
    К ответу выше, ещё вариант - хранить не значение, а список.
    В итоге пустой список будет пропускаться (не будет входить в uniq), а так же появляется доп. возможность - один документ сможет "резервировать" несколько уникальных значений. Например при уникальности email, в уникальность можно будет добавить аналоги uniq_email:['mail@yandex.ru', 'mail@ya.ru']
    Ответ написан
    Комментировать
  • Как осуществить удаленный доступ к MongoDB?

    @lega
    Ещё можно сделать ssh тунель в одну команду, я так иногда автоматические дампы с удаленного сервера делаю.
    Так же можно настроить openvpn или т.п.
    Эти способы лучше по безопасности и удобнее если у клиента динамический ip.

    PS: В mongodb не рекомендуют использовать авторизацию по логину+паролю.
    Ответ написан
    Комментировать
  • Стоит ли сохранять в mongodb значения с null, или игнорировать их при записи?

    @lega
    Если вы будете искать по пустому полю, то null нужен.
    Если эти поля заполнятся в будущем, то можно положить null, чтобы меньше раздуть padding factor.
    Так же с null, объекты выглядят "целее".
    Ответ написан
    Комментировать
  • Что покрутить в настройках MongoDB или самой ОС, чтобы быть готовым к всплеску инсертов?

    @lega
    Увеличение количества выделенных ядер не привело к улучшению ситуации.
    Потому что процесс упирается в io и блокировки в MongoDB при записи не причем.

    Суммарный объем дынных около 1 гигабайта.
    Оперативки выделено 8 гигов.
    Запихайте всю коллекцию в RAM.

    Примерно раз в час возникает задача быстро обновить около 20 миллионов записей.
    Но я бы лучше в первую очередь пересмотрел алгоритм, почему drop/insert а не update?
    Возможно вообще обновлять не нужно, а делать реалтайм "декорацию" данных при получении?
    Расскажите подробнее про задачу.
    Ответ написан
    Комментировать
  • Как правильно использовать индексы в MongoDB?

    @lega
    db.users.find({"age" : {"$gte" : 25, "$lte" : 35}}).sort({"username" : 1}).limit(100)
    советуется брать следующий индекс {"username" : 1, "age" : 1}, вместо
    {"age":1,"username":1}.

    А должно быть наоборот.

    Зачастую (но не всегда) порядок такой:
    1) Фильтр на точные значения
    2) Поля сортировки
    3) Фильтр на "выборочные" значения (массивы).

    В вашем случае ("age" : {"$gte" : 25, "$lte" : 35}) - это как бы точное значение (т.к. оно укладывается в "a < x < b"), далее идет сортировка ("username" : 1).
    Т.е. получается монга "берет" пачку данных ...24,|25<=age<=35|,36... где в каждом из возрастов выбирает все значения по порядку т.к. они уже отсортированы.

    Если индекс будет наоборот ({"username" : 1, "age" : 1}), то монга будет "входить" как бы в каждый username, брать из каждого вхождения диапазон 25<=age<=35, а потом сортировать все данные. - т.е. сортировка в начале тут лишняя.
    Как то так.

    Очень важно что-б сортировка "не ломалась" при проходе по индексу.

    Вот полезная статья.
    Ответ написан
    2 комментария
  • Удаление повторяющихся записей в MongoDB

    @lega
    Это едино-разовая задача, поэтому можно любым способом.
    Например можно сделать
    1) mongodump
    2) drop коллекции
    3) Сделать uniq индекс
    4) mongorestore
    Ответ написан
    Комментировать
  • Как в Mongodb сделать выборку строк по значениям строк связанной коллекции?

    @lega
    Тут наверно только "в лоб", первым запросом получить всех нужных авторов, вторым - получить книги по этим авторам. Так же нужно что-б были необходимые индексы.
    Если операция частая, то лучше изменить структуру/сделать кеширование (например сделать books.author_country)
    Ответ написан
  • Какой принцип использовать для хранения данных в MongoDB?

    @lega
    В будущем потребуется хранить и редактировать огромные объёмы информации

    На счет объемов, у вас наверняка для книг будут картинки (постеры), дак вот они могут занимать большую часть хранилища (+ большую часть расхода), я работал с одним книжным сайтом - на каждую книгу с отзывами (~4kb) есть несколько картинок (~120kb), т.е. ~97% (от книг) это картинки.
    Ответ написан
  • Какой принцип использовать для хранения данных в MongoDB?

    @lega
    Зависит от использования, например если отзывы будут выводится на странице книги и больше с ними ничего не будет происходить, то их удобно сделать вложенными, + экономия на запросах, одним запросом будет доставаться книга и отзывы.
    А вот авторов лучше (можно) в отдельную коллекцию, т.к. их данные будут изменятся (имя, фотка, описание, теги?), Хотя если эти изменения очень редкие или вовсе нет, то можно сделать вложенными, при этом будет больший расход диска, но экономия на запросах.
    Ответ написан
    1 комментарий