Ответы пользователя по тегу MongoDB
  • Как найти и вернуть записи в Mongodb?

    nowm
    @nowm
    Вот это должно быть параметром метода find: { "title": "статьи","text": "статьи"}. Но у вас в качестве критерия для запроса указан пустой объект (это значит, что выберутся все документы из коллекции), а в select указан дополнительный объект, который говорит, что нужно из результатов брать поля _id, title и text.

    Метод select в Mongoose, кстати, используется немного не так. Когда вы передаёте в него в качестве параметра объект, нужно значениям указывать либо 1 (поле включено в результат), либо 0 (поле не включается в результат). Если вы передаёте непустую строку в качестве значения, она воспринимается как 1, но это будет искажать ваше понимание того, что происходит. Select — это только указание, какие поля должны быть в результате, этот метод вообще никак не влияет на условие выборки документов из коллекции. Условия выборки указываются в find.
    Ответ написан
    4 комментария
  • Ошибка при подключении к MongoDB. Как исправить?

    nowm
    @nowm
    В драйвере MongoDB для Java нет класса MongoClients (с буквой s в конце). Есть класс MongoClient.

    Так что, нужно писать так:

    MongoClient mongoClient = MongoClient.create("mongodb link");


    И если вы где-то делаете import com.mongodb.client.MongoClients — удалите, это не правильно.

    Edit: в некоторых версиях драйвера у класса MongoClient нет статического метода create. В этом случае клиент создаётся так:

    MongoClient mongoClient = new MongoClient("mongodb link");
    Ответ написан
    2 комментария
  • Как перманентно поставить владельца файла .sock на mongodb?

    nowm
    @nowm
    Посмотрите конфигурацию сервиса mongod. Она должна быть в файле /lib/systemd/system/mongod.service.

    После названия раздела [Service] должны идти эти строки:
    User=mongodb
    Group=mongodb


    Это влияет на то, кому будет принадлежать файл /tmp/mongodb-27017.sock. Так же, запускать/перезапускать сервис лучше только командой sudo systemctl start mongod.service

    Ещё, судя по тому, что у вас в команде systemctl написано mongod, а не mongod.service, вы, возможно используете собственную конфигурацию для запуска, и тогда нужно редактировать другой файл — вы должны быть в курсе, какой именно, потому что наверняка сами его писали. В оригинальном файле с конфигурацией сервиса, который по-умолчанию создаётся после установки MongoDB, целевой пользователь/группа прописываются правильно и проблем не создают.
    Ответ написан
    5 комментариев
  • Как указать минимальную/максимальную длину для string в rules?

    nowm
    @nowm
    В MongoDB, насколько я знаю, нет таких лимитов. Лимиты распространяются только на итоговый размер всего документа после конвертации в BSON (16 мегабайт). Так что, если вы хотите ввести какие-то лимиты, вроде максимальной длины имени пользователя в 20 символов, обрезать строки до нужной длины придётся самостоятельно где-то в коде.
    Ответ написан
    Комментировать
  • Как в mongodb узнать что определённые данные изменились?

    nowm
    @nowm
    В монго, начиная с версии 3.6. есть такая штука, как Change Streams. Суть в том, что вы в коде, после соединения с БД, специальным образом подписываетесь на изменения данных. Например, если нужно отслеживать изменения в коллекции Books:

    const collection = db.collection('Books');
    const changeStream = collection.watch();
    changeStream.on('change', event => {
      // event — см. типы событий: https://docs.mongodb.com/manual/reference/change-events/
    });


    Важный момент: Change Streams работает только если сервер MongoDB запущен в режиме кластера, а не как он по-умолчанию запускается. Немного подробностей о том, как это сделать: https://habr.com/ru/post/335772/ (см. раздел «Настройка и добавление серверов в Replica Set»).
    Ответ написан
    Комментировать
  • Как узнать какой порт занимает MongoDB в Ubuntu 14.10?

    nowm
    @nowm
    cat /etc/mongod.conf | grep "^port"

    Если ничего не выведется, значит используется порт по-умолчанию. Если выведется — будет видно, на каком порту висит монго.

    Так же, может помочь cat /var/log/mongodb/mongod.log — там, возможно будет написано, в чём проблема. Может быть вы к правильному порту цепляетесь, но нужно дополнительно вводить имя пользователя и пароль для авторизации.

    Я тоже пользуюсь Robomongo — он на локальной машине нормально всё находит. Если вы пытаетесь с локальной машины подсоединиться к удалённой, то проблемы могут быть из-за того, что монго, по-умолчанию, принимает соединения только с локальной машины.
    Ответ написан
  • Почему mongodb не находит гео-точку?

    nowm
    @nowm
    Edit: удалил весь предыдущий текст.

    Суть в том, что для $box нужно задавать координаты таким образом:
    $box: [
        [ <нижний левый угол> ],
        [ <верхний правый угол> ]
    ]


    При этом, сначала должна указываться долгота (longtitude), а потом широта (latitude). Для Москвы долгота, грубо говоря, — 37, а широта — 55 (опять же, в грубом приближении).

    Чтобы понять, где будет находиться нижний левый и верхний правый углы, нужно представить всю ситуацию так: плюсовая долгота начинается от Лондона и идёт вправо. Плюсовая широта начинается от экватора и идёт вверх. Значит точка с координатами (0, 0) будет находиться левее и ниже Москвы. В левом нижнем углу будут минимальные широта и долгота, а в правом верхнем углу — максимальные широта и долгота.

    Чтобы сделать правильные координаты для $box, нужно для левого нижнего угла взять минимальные значения широты и долготы — [36.362, 55.38691], а для верхнего правого — максимальные, [38.573, 56.00606]. В итоге, этот запрос охватывает точку, которую вы искали:

    db.places.find({
        loc: {
            $within: {
                $box: [
                    [36.362, 55.38691], 
                    [38.573, 56.00606]
                ]
            } 
        } 
    })


    На моей машине, во всяком случае, он нормально работает, и нужная точка попадает в диапазон.
    Ответ написан