Ответы пользователя по тегу MongoDB
  • Как сделать вложенные комментарии в mongodb?

    @lega
    Как прикрепить новый комментарий в нужное место?
    Видимо ссылкой на родительский коммент.

    И как сосчитать все комментарии с учетом ответов?
    В каждом комменте храните ссылку на пост/статью, таким образом все комментарии поста можно будет вынимать одним запросом, а при добавлении комментария инкрементируйте "числоКомментов" в документе поста, этим вы будите иметь кол-во комментов поста без выкачивания этих самых комментов.

    А если вы на прямую не обращаетесь к коментам (бывает и такое), то можно все коменты засунуть в один документ если позволяют лимиты.

    Пример, пост:
    {
    post_id: 'p1',
    text: '...'
    }

    Комментарий в корне
    {
    comment_id: 'c1'
    parent_comment: null,
    post_id: 'p1',
    text: '...'
    }

    Дочерний комментарий:
    {
    comment_id: 'c2'
    parent_comment: 'c1',
    post_id: 'p1',
    text: '...'
    }

    Добавить дочерний комментарий к комменту c2:
    db.comment.insert({parent_comment: 'c2', post_id: 'p', text: '...'})

    Выборка всех комментов по посту:
    db.comment.find({post_id: 'p1'})
    Из полученного списка строите дерево комментов.
    Ответ написан
  • Как управлять кешем в MongoDB WiredTiger?

    @lega
    Попробуйте версию посвежее, вроде 3.1.7 уже есть.
    Ответ написан
    Комментировать
  • Последние сообщения в чате?

    @lega
    Если нагрузка большая, то можно сделать кеш коллекцию где будут хранится только последние сообщения в разрезе чата.
    Если нагрузка маленькая, то можно выбирать по одному.
    Ответ написан
    Комментировать
  • Почему MongoDB 3.0 выдает ошибку при попытки получить записи?

    @lega
    Видимо курсор нужно перебрать в цикле, или хотя бы конвертировать в массив перед отображением.
    Ответ написан
    Комментировать
  • Стоит ли использовать сейчас MongoDB 3.0 или 2.4?

    @lega
    3.0, т.к. там много улучшений, выше скорость.
    Количество основных методов не изменилось, появились варианты их вызова, для большей ясности и меньшего количества ошибок, например чтобы обновлением не перетереть весь документ.
    Ответ написан
    Комментировать
  • Какой выбрать ключ шардирования в MongoDB?

    @lega
    Т.е. на вход подается N товаров

    товар == артикул?
    Т.к. скорость записи не так важна, то можно рассмотреть такой вариант - "схлопнуть" все данные по товару, т.е. один артикул содержит список прайсов+производителей где он участвует. Шардить по артиклу.
    + экономия памяти - кол-во документов в 5 раз меньше, артикул (и наименование) общие.
    Ответ написан
  • Как сделать пагинацию с MongoDB?

    @lega
    skip(), limit() работают быстро, вам нужно просто сделать правильный индекс.

    брать id последнего документа и делать find()

    Это может работать медленнее, зависит от запроса и индексов.
    А вообще для пагинации этот способ хорош тем что выдаст как раз следующие N элементов, когда skip+limit вам выдадут "дубли" с предыдущей страницы если в базе появятся новые элементы (например на хабре если перелистывать страницу раз в час, то можно на 2-й странице увидеть посты которые вы просмотрели на 1-й странице)
    Ответ написан
  • Как правильно организовать получение данных из mongo?

    @lega
    Сделайте асинхронный воркер на asyncio/tornado/gevent, запустите там zmq для приема сообщений от скрипта и websocket для общения с клиентом, так же из веб приложения сможете отправлять клиенту. Будет что-то типа:
    Скрипт --(zmq)--> async_сервер --(ws)--> Клиент
    Ответ написан
    Комментировать
  • MongoDB выбрать из вложенного массива?

    @lega
    Не пытайтесь сделать хитроумные запросы (которые зачастую медленные), часто лучше сделать структуру документа где можно будет легко и быстро доставать данные.

    Например для вашей задачи можно сделать так:
    > db.qtest.insert({
    	date: Date("2013-01-14"),
    	name: "Roma",
    	tags:['python', 'ruby', 'c'],
    	counts: {python: 14, ruby:10, c:4 }
    })

    Поиск:
    > db.qtest.find({tags: 'python'}, {date: 1, name:1, 'counts.python':1}).pretty()
    {
    	"_id" : ObjectId("55a28f4624db1e49cecbc89f"),
    	"date" : "Sun Jul 12 2015 21:01:10 GMT+0500 (YEKT)",
    	"name" : "Roma",
    	"counts" : {
    		"python" : 14
    	}
    }

    Далее можете сделать индекс по тегам db.qtest.ensureIndex({tags: 1}), и этот запрос будет работать быстро когда коллекция будет большая.
    Ответ написан
    Комментировать
  • Когда лучше хранить изображения в файловой системе а когда в БД?

    @lega
    в БД:
    + вы можете добавить специфичеких индексов и использовать разные запросы для быстрого получения файлов
    + вместе с файлом можно хранить метаданные
    + бекап/дамп делается сразу по данным и файлам
    + в монге есть шардинг и реплика из коробки, когда файлы не влазят на хост или не хватает io
    - нужно делать инструменты для раздачи файлов
    в ФС:
    + есть готовые инструменты для раздачи
    - все остальные пункты сверху (реплика, метаданные, дамп отдельно, нет индексов и запросов)
    Ответ написан
    Комментировать
  • Есть ли смысл в инкрементируемых ИД для всех таблиц в mongodb?

    @lega
    Есть ли смысл в инкрементируемых ИД для всех таблиц в mongodb?

    Обычно нет.
    У стандартного _id (ObjectID) есть преимущество, он создается до записи в БД, т.е. что-б узнать итоговый ид, не нужно ждать когда запись в БД завершится, в отличие от инкрементального ид.
    Это позволяет, например, отдавать клиенту результат сразу, без ожидания записи (когда нужно отдать ид). Или "клиент" может сам задать _id в запросе, и не ждать ответа, зная какой _id будет у документа. Это дает дополнительную гибкость и производительность.
    Ответ написан
    Комментировать
  • Не могу подключиться к удаленному MongoDb через консоль?

    @lega
    Нужно подключаться анонимом, и логиниться (уже из консоли) командой db.auth (пример)
    Ответ написан
  • Как в MongoDB найти почти равные углы?

    @lega
    Операция "$or" медленная, можно её выкинуть и сделать так - хранить координату в нескольких разрезах:
    {
    direction: 350,
    direction_index: [-10, 350]
    }
    и искать уже по индексу:
    .find({direction_index: { $lte: -22, $gte: 22}})
    в итоге вам нужно что-бы фильтр укладывался в -360..360
    Ответ написан
    3 комментария
  • Выборка данных из MongoDB по дата и их отсутствию?

    @lega
    Можно оптимизировать, хранить end=start, на клиенте это учитывать.
    Ответ написан
    Комментировать
  • Можно ли в mongo сделать вложеный запрос в другую таблицу?

    @lega
    В самой монге нет джойнов, но вы можете хранить reviews прямо в events.
    Ответ написан
  • Как работает авторизация в Mongo?

    @lega
    У меня работает:

    Запустил сервер:
    $ mongod --auth --dbpath /tmp/1 --smallfiles --port 27020

    Добавляю пользователя:
    $ mongo --port 27020
    MongoDB shell version: 2.6.10
    connecting to: 127.0.0.1:27020/test
    > show dbs
    admin  (empty)
    local  0.031GB
    > use admin
    switched to db admin
    > db.addUser({user:'name', pwd:'password', roles:["userAdminAnyDatabase","dbAdminAnyDatabase", "readWriteAnyDatabase"]})
    WARNING: The 'addUser' shell helper is DEPRECATED. Please use 'createUser' instead
    Successfully added user: {
            "user" : "name",
            "roles" : [
                    "userAdminAnyDatabase",
                    "dbAdminAnyDatabase",
                    "readWriteAnyDatabase"
            ]
    }
    > exit
    bye

    Проверяю:
    $ mongo --port 27020
    MongoDB shell version: 2.6.10
    connecting to: 127.0.0.1:27020/test
    > show dbs
    2015-05-27T16:35:46.071+0500 listDatabases failed:{
            "ok" : 0,
            "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
            "code" : 13
    } at src/mongo/shell/mongo.js:47
    > use admin
    switched to db admin
    > db.auth('name', 'password')
    1
    > show dbs
    admin  0.031GB
    local  0.031GB

    Т.е. при подключении нет прав до авторизации.

    Как вариант, можете попробовать обновится на 2.6, там не много изменений.
    Ответ написан
    6 комментариев
  • MongoDB выборка на шардинге, ищет параллельно по всем нодам?

    @lega
    Они размазываются по всем нодам по id

    Зачем по id?

    Сделайте уникальный индекс (шардинг) по username, тогда запрос будет к конкретному шарду в котором это имя (есть или должно быть). И при добавлении не нужно будет проверять, т.к. дубль имени не запишется (будет ошибка).
    Ответ написан
    Комментировать
  • MongoDB: как осуществить поиск?

    @lega
    Используйте словарь вместо массива:
    {
      data1: {key1: value1, key2: value2},
      data2: {key2: value2, key2: value2}
    }

    db.col.update(match, {$set: {'data2.key2': value2}})

    PS: если бы вы привели что у вас там хранится и что нужно получать, можно было бы лучше подобрать структуру и запросы.
    Ответ написан
    4 комментария
  • Как восстановить базу данных admin в mongodb?

    @lega
    Сдампить все базы, очистить папку, перезапустить. Монга при старте создаёт все файлы если папка пустая.
    Ответ написан
  • Как определить заполняемость БД?

    @lega
    db.stats()
    db.collection.stats()
    db.collection.count()
    Ответ написан
    Комментировать