MongoDB - Документ запроса

В этой главе мы узнаем, как запрашивать документ из коллекции MongoDB.

Метод find ()

Чтобы запросить данные из коллекции MongoDB, вам необходимо использовать MongoDB find() метод.

Синтаксис

Базовый синтаксис find() метод выглядит следующим образом -

>db.COLLECTION_NAME.find()

find() метод отобразит все документы в неструктурированном виде.

пример

Предположим, мы создали коллекцию с именем mycol как -

> use sampleDB
switched to db sampleDB
> db.createCollection("mycol")
{ "ok" : 1 }
>

И вставил в него 3 документа с помощью метода insert (), как показано ниже -

> db.mycol.insert([
	{
		title: "MongoDB Overview",
		description: "MongoDB is no SQL database",
		by: "tutorials point",
		url: "http://www.tutorialspoint.com",
		tags: ["mongodb", "database", "NoSQL"],
		likes: 100
	},
	{
		title: "NoSQL Database",
		description: "NoSQL database doesn't have tables",
		by: "tutorials point",
		url: "http://www.tutorialspoint.com",
		tags: ["mongodb", "database", "NoSQL"],
		likes: 20,
		comments: [
			{
				user:"user1",
				message: "My first comment",
				dateCreated: new Date(2013,11,10,2,35),
				like: 0
			}
		]
	}
])

Следующий метод извлекает все документы в коллекции -

> db.mycol.find()
{ "_id" : ObjectId("5dd4e2cc0821d3b44607534c"), "title" : "MongoDB Overview", "description" : "MongoDB is no SQL database", "by" : "tutorials point", "url" : "http://www.tutorialspoint.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
{ "_id" : ObjectId("5dd4e2cc0821d3b44607534d"), "title" : "NoSQL Database", "description" : "NoSQL database doesn't have tables", "by" : "tutorials point", "url" : "http://www.tutorialspoint.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 20, "comments" : [ { "user" : "user1", "message" : "My first comment", "dateCreated" : ISODate("2013-12-09T21:05:00Z"), "like" : 0 } ] }
>

Метод pretty ()

Чтобы отобразить результаты в форматированном виде, вы можете использовать метод pretty ().

Синтаксис

>db.COLLECTION_NAME.find().pretty()

пример

Следующий пример извлекает все документы из коллекции с именем mycol и упорядочивает их в удобном для чтения формате.

> db.mycol.find().pretty()
{
	"_id" : ObjectId("5dd4e2cc0821d3b44607534c"),
	"title" : "MongoDB Overview",
	"description" : "MongoDB is no SQL database",
	"by" : "tutorials point",
	"url" : "http://www.tutorialspoint.com",
	"tags" : [
		"mongodb",
		"database",
		"NoSQL"
	],
	"likes" : 100
}
{
	"_id" : ObjectId("5dd4e2cc0821d3b44607534d"),
	"title" : "NoSQL Database",
	"description" : "NoSQL database doesn't have tables",
	"by" : "tutorials point",
	"url" : "http://www.tutorialspoint.com",
	"tags" : [
		"mongodb",
		"database",
		"NoSQL"
	],
	"likes" : 20,
	"comments" : [
		{
			"user" : "user1",
			"message" : "My first comment",
			"dateCreated" : ISODate("2013-12-09T21:05:00Z"),
			"like" : 0
		}
	]
}

Метод findOne ()

Помимо метода find () существует findOne() метод, который возвращает только один документ.

Синтаксис

>db.COLLECTIONNAME.findOne()

пример

В следующем примере извлекается документ с заголовком Обзор MongoDB.

> db.mycol.findOne({title: "MongoDB Overview"})
{
	"_id" : ObjectId("5dd6542170fb13eec3963bf0"),
	"title" : "MongoDB Overview",
	"description" : "MongoDB is no SQL database",
	"by" : "tutorials point",
	"url" : "http://www.tutorialspoint.com",
	"tags" : [
		"mongodb",
		"database",
		"NoSQL"
	],
	"likes" : 100
}

СУБД, эквивалентные предложениям в MongoDB

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

Операция Синтаксис пример Эквивалент РСУБД
Равенство {<ключ>: {$ например; <значение>}} db.mycol.find ({"автор": "точка обучения"}). pretty () где by = 'точка обучения'
Меньше, чем {<ключ>: {$ lt: <значение>}} db.mycol.find ({"любит": {$ lt: 50}}). pretty () где лайков <50
Меньше, чем равно {<ключ>: {$ lte: <значение>}} db.mycol.find ({"любит": {$ lte: 50}}). pretty () где лайков <= 50
Лучше чем {<ключ>: {$ gt: <значение>}} db.mycol.find ({"любит": {$ gt: 50}}). pretty () где лайков> 50
Больше чем равно {<ключ>: {$ gte: <значение>}} db.mycol.find ({"любит": {$ gte: 50}}). pretty () где лайков> = 50
Не равно {<ключ>: {$ ne: <значение>}} db.mycol.find ({"любит": {$ ne: 50}}). pretty () где лайки! = 50
Значения в массиве {<ключ>: {$ in: [<значение1>, <значение2>, …… <значениеN>]}} db.mycol.find ({"name": {$ in: ["Raj", "Ram", "Raghu"]}}). pretty () Где имя соответствует любому из значений в: ["Радж", "Рам", "Рагху"]
Значения не в массиве {<ключ>: {$ nin: <значение>}} db.mycol.find ({"name": {$ nin: ["Ramu", "Raghav"]}}). pretty () Если значений имени нет в массиве: ["Ramu", "Raghav"] или вообще не существует

И в MongoDB

Синтаксис

Чтобы запрашивать документы на основе условия И, вам необходимо использовать $ и ключевое слово. Ниже приведен основной синтаксис оператора AND -

>db.mycol.find({ $and: [ {<key1>:<value1>}, { <key2>:<value2>} ] })

пример

В следующем примере будут показаны все учебные пособия, написанные «точкой обучения» и названные «Обзор MongoDB».

> db.mycol.find({$and:[{"by":"tutorials point"},{"title": "MongoDB Overview"}]}).pretty()
{
	"_id" : ObjectId("5dd4e2cc0821d3b44607534c"),
	"title" : "MongoDB Overview",
	"description" : "MongoDB is no SQL database",
	"by" : "tutorials point",
	"url" : "http://www.tutorialspoint.com",
	"tags" : [
		"mongodb",
		"database",
		"NoSQL"
	],
	"likes" : 100
}
>

Для приведенного выше примера эквивалент предложения where будет ' where by = 'tutorials point' AND title = 'MongoDB Overview' '. Вы можете передать любое количество пар ключ-значение в предложении find.

ИЛИ в MongoDB

Синтаксис

Чтобы запрашивать документы на основе условия ИЛИ, вам необходимо использовать $orключевое слово. Ниже приведен основной синтаксисOR -

>db.mycol.find(
   {
      $or: [
         {key1: value1}, {key2:value2}
      ]
   }
).pretty()

пример

В следующем примере будут показаны все учебные пособия, написанные «точкой обучения» или чье название - «Обзор MongoDB».

>db.mycol.find({$or:[{"by":"tutorials point"},{"title": "MongoDB Overview"}]}).pretty()
{
   "_id": ObjectId(7df78ad8902c),
   "title": "MongoDB Overview", 
   "description": "MongoDB is no sql database",
   "by": "tutorials point",
   "url": "http://www.tutorialspoint.com",
   "tags": ["mongodb", "database", "NoSQL"],
   "likes": "100"
}
>

Использование И и ИЛИ вместе

пример

В следующем примере будут показаны документы, которые имеют больше 10 лайков и заголовок либо «Обзор MongoDB», либо «Точка обучения». Эквивалент SQL, где предложение'where likes>10 AND (by = 'tutorials point' OR title = 'MongoDB Overview')'

>db.mycol.find({"likes": {$gt:10}, $or: [{"by": "tutorials point"},
   {"title": "MongoDB Overview"}]}).pretty()
{
   "_id": ObjectId(7df78ad8902c),
   "title": "MongoDB Overview", 
   "description": "MongoDB is no sql database",
   "by": "tutorials point",
   "url": "http://www.tutorialspoint.com",
   "tags": ["mongodb", "database", "NoSQL"],
   "likes": "100"
}
>

NOR в MongoDB

Синтаксис

Чтобы запрашивать документы на основе условия НЕ, вам нужно использовать ключевое слово $ not. Ниже приведен основной синтаксисNOT -

>db.COLLECTION_NAME.find(
	{
		$not: [
			{key1: value1}, {key2:value2}
		]
	}
)

пример

Предположим, мы вставили в коллекцию 3 документа empDetails как показано ниже -

db.empDetails.insertMany(
	[
		{
			First_Name: "Radhika",
			Last_Name: "Sharma",
			Age: "26",
			e_mail: "[email protected]",
			phone: "9000012345"
		},
		{
			First_Name: "Rachel",
			Last_Name: "Christopher",
			Age: "27",
			e_mail: "[email protected]",
			phone: "9000054321"
		},
		{
			First_Name: "Fathima",
			Last_Name: "Sheik",
			Age: "24",
			e_mail: "[email protected]",
			phone: "9000054321"
		}
	]
)

В следующем примере будут извлечены документы, имя которых не «Радхика», а фамилия не «Кристофер».

> db.empDetails.find(
	{
		$nor:[
			40
			{"First_Name": "Radhika"},
			{"Last_Name": "Christopher"}
		]
	}
).pretty()
{
	"_id" : ObjectId("5dd631f270fb13eec3963bef"),
	"First_Name" : "Fathima",
	"Last_Name" : "Sheik",
	"Age" : "24",
	"e_mail" : "[email protected]",
	"phone" : "9000054321"
}

НЕ в MongoDB

Синтаксис

Чтобы запрашивать документы на основе условия НЕ, вам необходимо использовать ключевое слово $ not, следующее является основным синтаксисом NOT -

>db.COLLECTION_NAME.find(
	{
		$NOT: [
			{key1: value1}, {key2:value2}
		]
	}
).pretty()

пример

В следующем примере будут извлечены документы, возраст которых не превышает 25 лет.

> db.empDetails.find( { "Age": { $not: { $gt: "25" } } } )
{
	"_id" : ObjectId("5dd6636870fb13eec3963bf7"),
	"First_Name" : "Fathima",
	"Last_Name" : "Sheik",
	"Age" : "24",
	"e_mail" : "[email protected]",
	"phone" : "9000054321"
}