Руководство по MongoDB. Изменение документа.

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

Для этих целей в MongoDB существуют методы update() и save(). Метод update() изменяет значения уже существующего документа в то время, как метод save() перезаписывает существующий документ.


Метод update()

Общий метод имеет следующий вид:


db.ИМЯ_КОЛЛЕКЦИИ.update(КРИТЕРИЙ_ВЫБОРА, ИЗМЕНЁННЫЕ_ДАННЫЕ)

Для понимания того, как это работает на практике, рассмотрим простой пример:

Предположим, что у нас есть коллекция developers, которая содержит следующие документы:


> db.developers.find().pretty()
{
	"_id" : ObjectId("5815f4e735ee883c37ac8b4d"),
	"title" : "Eugene Suleimanov",
	"specialty" : "Java",
	"skills" : [
		"Java",
		"Hibernate",
		"Spring"
	],
	"salary" : 2000
}
{
	"_id" : ObjectId("5815f4ec35ee883c37ac8b4e"),
	"title" : "Ivan Ivanov",
	"specialty" : "Java",
	"skills" : [
		"Java",
		"Hibernate",
		"Spring"
	],
	"salary" : 3000
}
{
	"_id" : ObjectId("5815f4f535ee883c37ac8b4f"),
	"title" : "Nikolai Nikolaev",
	"specialty" : "C++",
	"skills" : [
		"C++",
		"STL",
		"SQL"
	],
	"salary" : 2500
}

Допустим, что мы хотим изменить поле salary у разработчика с именем Eugene Suleimanov. Для этого нам необходимо выполнить следующую команду:


> db.developers.update( {'title':'Eugene Suleimanov'}, {$set : { 'salary': 2500 }} )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Проверим содержимое коллекции developers после выполнения предыдущей команды:


> db.developers.find().pretty()
{
	"_id" : ObjectId("5815f4e735ee883c37ac8b4d"),
	"title" : "Eugene Suleimanov",
	"specialty" : "Java",
	"skills" : [
		"Java",
		"Hibernate",
		"Spring"
	],
	"salary" : 2500
}
{
	"_id" : ObjectId("5815f4ec35ee883c37ac8b4e"),
	"title" : "Ivan Ivanov",
	"specialty" : "Java",
	"skills" : [
		"Java",
		"Hibernate",
		"Spring"
	],
	"salary" : 3000
}
{
	"_id" : ObjectId("5815f4f535ee883c37ac8b4f"),
	"title" : "Nikolai Nikolaev",
	"specialty" : "C++",
	"skills" : [
		"C++",
		"STL",
		"SQL"
	],
	"salary" : 2500
}

Как мы видим, запись была изменена.
Для того, чтобы изменить несколько записей необходимо установить параметр multi в значение true.

Изменим зарплату всем разработчикам, со специальностью Java:


> db.developers.update( {'specialty':'Java'}, {$set : { 'salary': 3500 }}, {multi: true} )
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })

Проверим нашу коллекцию developers ещё раз:


> db.developers.find().pretty()
{
	"_id" : ObjectId("5815f4e735ee883c37ac8b4d"),
	"title" : "Eugene Suleimanov",
	"specialty" : "Java",
	"skills" : [
		"Java",
		"Hibernate",
		"Spring"
	],
	"salary" : 3500
}
{
	"_id" : ObjectId("5815f4ec35ee883c37ac8b4e"),
	"title" : "Ivan Ivanov",
	"specialty" : "Java",
	"skills" : [
		"Java",
		"Hibernate",
		"Spring"
	],
	"salary" : 3500
}
{
	"_id" : ObjectId("5815f4f535ee883c37ac8b4f"),
	"title" : "Nikolai Nikolaev",
	"specialty" : "C++",
	"skills" : [
		"C++",
		"STL",
		"SQL"
	],
	"salary" : 2500
}

Как мы видим – все разработчики со специальностью Java имеют зарплату 3500.


Метод save()

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

Данный метод имеет следующий синтаксис:


db.ИМЯ_КОЛЛЕКЦИИ.save( {_id:ObjectId(), НОВЫЕ_ДАННЫЕ} )

Для понимания того, как это работает на практике рассмотрим простой пример:
Наша коллекция developers имеет следующий вид:


> db.developers.find().pretty()
{
	"_id" : ObjectId("5815f4e735ee883c37ac8b4d"),
	"title" : "Eugene Suleimanov",
	"specialty" : "Java",
	"skills" : [
		"Java",
		"Hibernate",
		"Spring"
	],
	"salary" : 3500
}
{
	"_id" : ObjectId("5815f4ec35ee883c37ac8b4e"),
	"title" : "Ivan Ivanov",
	"specialty" : "Java",
	"skills" : [
		"Java",
		"Hibernate",
		"Spring"
	],
	"salary" : 3500
}
{
	"_id" : ObjectId("5815f4f535ee883c37ac8b4f"),
	"title" : "Nikolai Nikolaev",
	"specialty" : "C++",
	"skills" : [
		"C++",
		"STL",
		"SQL"
	],
	"salary" : 2500
}

Перезапишем объект с ID:5815f4f535ee883c37ac8b4f.
Для этого нам необходимо использовать следующую команду:


> db.developers.save( { "_id": ObjectId("5815f4f535ee883c37ac8b4f"), "title" : "Nikolay Nikolaev", "specialty": "C++", "skills": ["C++", "STL", "SQL"], "salary" : 3500  } )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Проверим нашу коллекцию developers ещё раз:


> db.developers.find().pretty()
{
	"_id" : ObjectId("5815f4e735ee883c37ac8b4d"),
	"title" : "Eugene Suleimanov",
	"specialty" : "Java",
	"skills" : [
		"Java",
		"Hibernate",
		"Spring"
	],
	"salary" : 3500
}
{
	"_id" : ObjectId("5815f4ec35ee883c37ac8b4e"),
	"title" : "Ivan Ivanov",
	"specialty" : "Java",
	"skills" : [
		"Java",
		"Hibernate",
		"Spring"
	],
	"salary" : 3500
}
{
	"_id" : ObjectId("5815f4f535ee883c37ac8b4f"),
	"title" : "Nikolay Nikolaev",
	"specialty" : "C++",
	"skills" : [
		"C++",
		"STL",
		"SQL"
	],
	"salary" : 3500
}

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