Руководство по MongoDB. Запрос документа

В данной статье мы рассмотрим способы запроса документа коллекции в MongoDB.

 


Метод find()

Для запроса элемента коллекции в MongoDB нам необходимо использовать метод find(). Запрос имеет следующий вид:


db.ИМЯ_КОЛЛЕКЦИИ.find()

В результате выполнения данного запроса все документы коллекции будут отображены не структурировано.

Рассмотрим простой пример:
Выберем БД:


> use projectdb
switched to db projectdb

В данной БД у нас есть одна коллекция:


> show collections
developers

Попробуем получить все документы данной коллекции с помощью метода find()


> db.developers.find()
{ "_id" : ObjectId("580adbcf4ab788eb0072a3e1"), "title" : "Eugene Suleimanov", "specialty" : "Java Developer", "skills" : [ "Java", "Hibernate", "Spring" ] }


Метод pretty()
Для структурированного вывода данных коллекции используется метод pretty().
Данный запрос имеет следующий общий вид:


db.ИМЯ_КОЛЛЕКЦИИ.find().pretty()

В случае с нашей коллекцией developers данный запрос будет выглядеть следующим образом:


> db.developers.find().pretty()
{
	"_id" : ObjectId("580adbcf4ab788eb0072a3e1"),
	"title" : "Eugene Suleimanov",
	"specialty" : "Java Developer",
	"skills" : [
		"Java",
		"Hibernate",
		"Spring"
	]
}

Для получения документа также предусмотрен метод findOne(), который возвращает только один документ.


Параметризированные запросы

Также, как и в реляционных БД мы можем вводить параметры поиска записей в таблицах, в MongoDB предусмотрена возможность определять условия поиска документа в коллекции.

Для этих целей в MongoDB используются следующие операции:

Операция Синтаксис Пример Эквивалент в реляционной БД
Равенство {<key>:<value>} db.developers.find({“specialty”:”Java”}).pretty() where specialty = ‘Java’
Меньше, чем {<key>:{$lt:<value>}} db.developers.find({“salary”:{$lt:1000}}).pretty() where salary < 1000
Меньше, либо равно {<key>:{$lte:<value>}} db.developers.find({“salary”:{$lte:1000}}).pretty() where salary <= 1000
Больше, чем {<key>:{$gt:<value>}} db.developers.find({“salary”:{$gt:1000}}).pretty() where salary > 1000
Больше, либо равно {<key>:{$gte:<value>}} db.developers.find({“salary”:{$gte:1000}}).pretty() where salary >= 1000
Не равно {<key>:{$ne:<value>}} db.developers.find({“salary”:{$ne:1000}}).pretty() where salary != 1000

 


Операция AND

Для комбинирования нескольких условий в запросе используется оператор AND.

Данный запрос имеет следующий общий вид:


>db.ИМЯ_КОЛЛЕКЦИИ.find(
   {
      $and: [
         {ключ1: значение1}, {ключ2:значение2}
      ]
   }
).pretty()

Рассмотрим простой пример, но предварительно добавим несколько записей в нашу коллекцию developers:


> db.developers.insert({title: 'Ivan Ivanov', specialty: 'Java', skills: ['Java', 'Hibernate', 'Spring'], salary: 3000})
WriteResult({ "nInserted" : 1 })


> db.developers.insert({title: 'Nikolai Nikolaev', specialty: 'C++', skills: ['C++', 'STL', 'SQL'], salary: 2500})
WriteResult({ "nInserted" : 1 })

Теперь выберем всех Java разработчиков, у которых зарплата более 2000. Для этого составим следующий запрос:


> db.developers.find( { $and: [ { skills: "Java" }, {salary: { $gte: 2000 }} ] } ).pretty()
{
	"_id" : ObjectId("580ae3f74ab788eb0072a3e2"),
	"title" : "Ivan Ivanov",
	"specialty" : "Java",
	"skills" : [
		"Java",
		"Hibernate",
		"Spring"
	],
	"salary" : 3000
}



Операция OR
Для выбора документа, который соответствует одному из условий, в MongoDB используется команда $or.
Общий вид данной команда следующий:


>db.ИМЯ_КОЛЛЕКЦИИ.find(
   {
      $or: [
         {ключ1: значение1}, {ключ2:значение2}
      ]
   }
).pretty()

Для понимания того, как это работает на практике, рассмотрим простой пример.
Предположим, что мы хотим выбрать всех разработчиков из нашей коллекции developers, у который зарплата больше, либо равна 3000, или они являются C++ разработчиками.
Для этого нам необходимо составить следующий запрос:


> db.developers.find( { $or: [ {specialty: "C++"}, {salary: { $gte: 3000 }} ] } ).pretty()
{
	"_id" : ObjectId("580ae3f74ab788eb0072a3e2"),
	"title" : "Ivan Ivanov",
	"specialty" : "Java",
	"skills" : [
		"Java",
		"Hibernate",
		"Spring"
	],
	"salary" : 3000
}
{
	"_id" : ObjectId("580ae41a4ab788eb0072a3e3"),
	"title" : "Nikolai Nikolaev",
	"specialty" : "C++",
	"skills" : [
		"C++",
		"STL",
		"SQL"
	],
	"salary" : 2500
}


Комбинирование AND и OR
Рассмотрим простой пример, в котором мы попробуем получить всех разработчиков из нашей коллекции developers, у которых специальность зарплата более или равна 2000 и специальность Java либо Java Developer.
Для этого мы можем использовать следующий запрос:



> db.developers.find( {"salary": {$gte: 2000}, $or: [ {"specialty": "Java"}, {"specialty": "Java Developer"} ] } ).pretty()
{
	"_id" : ObjectId("580ae3f74ab788eb0072a3e2"),
	"title" : "Ivan Ivanov",
	"specialty" : "Java",
	"skills" : [
		"Java",
		"Hibernate",
		"Spring"
	],
	"salary" : 3000
}

На этом мы заканчиваем изучение способов запроса документа из коллекции.
В следующей статье мы рассмотрим, как в MongoDB изменить документ.