Хобрук: Ваш путь к мастерству в программировании

Найти некоторые значения в коллекции mongodb?

Я пытаюсь прочитать пользовательскую базу данных (mongo) с помощью java. На странице учебника я увидел, как прочитать всю коллекцию. Я могу сделать что-то вроде этого:

    DBCursor cursor = col.find();
    while (cursor.hasNext()) {
        System.out.println(cursor.next());
    }

Теперь, если у меня есть коллекция с пользователями: = имя, возраст, пароль (...) и что угодно. Теперь я хотел бы найти имя с паролем. Например, для процесса входа. Допустим, у меня есть две строки: String n и p. Если в базе данных есть user.equals(n) и password.equals(p), тогда войдите в систему. Как мне сменить курсор? Я видел несколько примеров запросов на странице учебника по java mongodb, но я действительно не понимаю...

Любые идеи? Спасибо


Ответы:


1

Потрясающе, вам понравится Монго.

В опубликованном вами примере программа перебирает набор результатов. В проблеме с пользователем/паролем вы описываете, что на самом деле пытаетесь получить один документ (а не набор документов) на основе некоторых критериев.

На оболочке это будет выглядеть так:

n = "login"
p = "password"

db.users.findOne({ user: n, password: p})

Обратите внимание, что я использую findOne вместо find, который возвращает документ вместо курсора ко многим документам.

Теперь давайте посмотрим на пример java-драйвера:

BasicDBObject query = new BasicDBObject();

query.put("i", 71);
cur = coll.find(query);

while(cur.hasNext()) {
    System.out.println(cur.next());
}

BasicDBObject создает объект запроса, а затем вы вводите различные критерии, которые вместе формируют ваш запрос.

Итак, вместо query.put("i", 71); вы бы сделали что-то вроде:

query.put("user", n)
query.put("password", p)

и... вместо цикла while просто используйте findOne вместо find, чтобы вам не приходилось перебирать набор результатов из 1 объекта (бессмысленно).

Вы можете узнать больше о findOne() здесь.

30.11.2011

2

Вы можете запросить нужные данные напрямую:

BasicDBObject query = new BasicDBObject();
query.put("name", "user");
query.put("password", "[YOUR ENCRYPTED PASSWORD HERE]");

DBCollection collection = db.getCollection("yourcollectionname");
DBCursor cursor = collection.find(query);

while (cursor.hasNext()) {
  //do something with cursor.next();
}

Как было предложено, вам нужно проверить количество результатов, возвращаемых методом find(), чтобы убедиться, что только одна запись соответствует вашему запросу.

30.11.2011
  • Технически правильно, но я считаю, что на самом деле должен быть только один пользователь/пароль, соответствующий запросу (цикл while предполагает наличие многих), а код предполагает, что пароль хранится в виде простого текста, что новички могут принять как должное. Это, конечно, не вопрос OP, как безопасно хранить пароли, но я думаю, что мы должны быть осторожны, чтобы не иметь плохих практик в ответах. 30.11.2011
  • Почему бы просто не использовать findOne и отказаться от обработки курсора, как в моем примере? 30.11.2011
  • @Tyler Brock findOne() не гарантирует, что в коллекции есть один пользователь, он просто вернет первое совпадение. 30.11.2011
  • Конечно, и обычно это именно то поведение, которое вам нужно. Если кто-то входит в систему и совпадений нет, это ошибка, и если совпадений больше одного, это тоже ошибка. 30.11.2011
  • Я не уверен, что findOne() возвращает ошибку, если в коллекции более одного совпадения? 30.11.2011
  • О, может быть, вы правы. Прохладный. Никогда не использовал java-драйвер лично. 30.11.2011
  • Новые материалы

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..