MongoDB: метод db.collection.findAndModify ()
db.collection.findAndModify
Метод db.collection.findAndModify () используется для изменения и возврата одного документа. По умолчанию возвращенный документ не содержит изменений, внесенных в обновление. Чтобы вернуть документ с изменениями, внесенными в обновление, используйте новый параметр.
Метод findAndModify () имеет следующую форму:
db.collection.findAndModify({
query: <document>,
sort: <document>,
remove: <boolean>,
update: <document>,
new: <boolean>,
fields: <document>,
upsert: <boolean>
});
Синтаксис:
db.collection.findAndModify (документ)
Параметры:
название | Описание | Необходимые / Необязательный | Тип |
---|---|---|---|
запрос | Критерии выбора для модификации. В поле запроса используются те же селекторы запросов, что и в методе db.collection.find (). Хотя запрос может соответствовать нескольким документам, findAndModify () выберет только один документ для изменения. | Необязательный | документ |
Сортировать | Определяет, какой документ изменяет операция, если запрос выбирает несколько документов. findAndModify () изменяет первый документ в порядке сортировки, заданном этим аргументом. | Необязательный | документ |
Удалить | Необходимо указать либо удалить, либо обновить поле. Удаляет документ, указанный в поле запроса. Установите значение true, чтобы удалить выбранный документ. По умолчанию установлено значение false. | необходимые | логический |
Обновить | Необходимо указать либо удалить, либо обновить поле. Выполняет обновление выбранного документа. В поле обновления используются те же операторы обновления или поле: спецификации значений, чтобы изменить выбранный документ. | необходимые | документ |
новый | При значении true возвращает измененный документ, а не оригинал. Метод findAndModify () игнорирует новый параметр для операций удаления. По умолчанию установлено значение false. | Необязательный | логический |
поля | Подмножество полей для возврата. В документе fields указано включение поля с 1, например: fields: {<field1>: 1, <field2>: 1, ...}. | Необязательный | документ |
upsert | Используется вместе с полем обновления. Когда true, findAndModify () создает новый документ, если ни один документ не соответствует запросу, или если документы соответствуют запросу, findAndModify () выполняет обновление. Чтобы избежать многократных загрузок, убедитесь, что поля запроса уникально проиндексированы. По умолчанию установлено значение false. | Необязательный | логический |
Возврат данных
Для операций удаления, если запрос соответствует документу, findAndModify () возвращает удаленный документ. Если запрос не соответствует документу, который нужно удалить, findAndModify () возвращает ноль.
Для операций обновления findAndModify () возвращает одно из следующего:
- Если новый параметр не установлен или имеет значение false:
- документ предварительной модификации, если запрос соответствует документу;
- в противном случае - ноль.
- Если новое верно:
- измененный документ, если запрос возвращает совпадение;
- вставленный документ, если upsert: true и ни один документ не соответствует запросу;
- в противном случае - ноль.
Образец документа в коллекции ресторанов:
{ "адрес": { «здание»: «1007», «координата»: [-73,856077, 40,848447], "улица": "Моррис Парк Авеню", почтовый индекс: 10462 }, "Боро": "Бронкс", "кухня": "пекарня", "оценки": [ {"date": {"$ date": 1393804800000}, "оценка": "A", "оценка": 2}, {"date": {"$ date": 1378857600000}, "оценка": "A", "оценка": 6}, {"date": {"$ date": 1358985600000}, "оценка": "A", "оценка": 10}, {"date": {"$ date": 1322006400000}, "оценка": "A", "оценка": 9}, {"date": {"$ date": 1299715200000}, "оценка": "B", "оценка": 14} ], "name": "Morris Park Bake Shop", "restaurant_id": "30075445" } .....
Пример : MongoDB: метод db.collection.findAndModify ()
Здесь мы создали дубликат копии коллекции ресторанов как restaurant1. Теперь мы будем работать с этой коллекцией.
Следующий метод обновляет и возвращает существующий документ в коллекции restaurant1, где документ соответствует критериям запроса:
db.restaurants1.findAndModify({
query: { "name" : "Douglaston Club" },
sort: { cuisine: 1 },
update: { $inc: { "age": 1 } },
});
Этот метод выполняет следующие действия:
Запрос находит документ в коллекции restaurant1, где поле имени имеет значение Douglaston Club .
Сортировка упорядочивает результаты запроса в порядке возрастания. Если несколько документов удовлетворяют условию запроса, метод выберет для модификации первый документ, упорядоченный таким образом.
Обновление увеличивает значение поля возраста на 1.
Метод возвращает исходный (т.е. перед изменением) документ, выбранный для этого обновления:
{
"_id" : ObjectId("55c3043ab165fa6355ec5cda"),
"address" : {
"building" : "600",
"coord" : [
-73.7522366,
40.7766941
],
"street" : "West Drive",
"zipcode" : "11363"
},
"borough" : "Queens",
"cuisine" : "American ",
"grades" : [
{
"date" : ISODate("2013-12-04T00:00:00Z"),
"grade" : "A",
"score" : 13
},
{
"date" : ISODate("2013-06-13T00:00:00Z"),
"grade" : "A",
"score" : 13
},
{
"date" : ISODate("2012-12-06T00:00:00Z"),
"grade" : "A",
"score" : 9
},
{
"date" : ISODate("2012-04-12T00:00:00Z"),
"grade" : "A",
"score" : 2
},
{
"date" : ISODate("2011-07-30T00:00:00Z"),
"grade" : "B",
"score" : 23
}
],
"name" : "Douglaston Club",
"restaurant_id" : "40364858"
}
Теперь выполните следующую инструкцию и посмотрите результат.
db.restaurants1.find({"name" : "Douglaston Club"}).pretty();
Здесь мы видим, что, поскольку в документах не было поля возраста, поэтому оно не обновлялось, а было создано новое поле возраста.
{
"_id" : ObjectId("55c3043ab165fa6355ec5cda"),
"address" : {
"building" : "600",
"coord" : [
-73.7522366,
40.7766941
],
"street" : "West Drive",
"zipcode" : "11363"
},
"borough" : "Queens",
"cuisine" : "American ",
"grades" : [
{
"date" : ISODate("2013-12-04T00:00:00Z"),
"grade" : "A",
"score" : 13
},
{
"date" : ISODate("2013-06-13T00:00:00Z"),
"grade" : "A",
"score" : 13
},
{
"date" : ISODate("2012-12-06T00:00:00Z"),
"grade" : "A",
"score" : 9
},
{
"date" : ISODate("2012-04-12T00:00:00Z"),
"grade" : "A",
"score" : 2
},
{
"date" : ISODate("2011-07-30T00:00:00Z"),
"grade" : "B",
"score" : 23
}
],
"name" : "Douglaston Club",
"restaurant_id" : "40364858",
"age" : 1
}
Теперь, чтобы вернуть измененный документ, добавьте в метод параметр new: true.
db.restaurants1.findAndModify({
query: { "name" : "Douglaston Club" },
sort: { cuisine: 1 },
update: { $inc: { "age": 1 } },
new : true
});
Выход
{ "_id": ObjectId ("55c3043ab165fa6355ec5cda"), "адрес" : { «здание»: «600», "координ": [ -73,7522366, 40.7766941 ], "улица": "Вест Драйв", почтовый индекс: 11363 }, "городской округ": "королевы", «кухня»: «американская», "оценки" : [ { «date»: ISODate («2013-12-04T00: 00: 00Z»), "оценка отлично", "оценка": 13 }, { «date»: ISODate («2013-06-13T00: 00: 00Z»), "оценка отлично", "оценка": 13 }, { «date»: ISODate («2012-12-06T00: 00: 00Z»), "оценка отлично", "оценка": 9 }, { «date»: ISODate («2012-04-12T00: 00: 00Z»), "оценка отлично", "оценка": 2 }, { «date»: ISODate («2011-07-30T00: 00: 00Z»), "оценка": "B", "оценка": 23 } ], "имя": "Дугластон Клуб", "restaurant_id": "40364858", "возраст": 2 }
Получить данные о ресторанах здесь
Поведение
Upsert и уникальный индекс
Когда findAndModify () включает опцию upsert: true, а поля запроса не индексируются однозначно, метод может при определенных обстоятельствах вставлять документ несколько раз.
Предыдущая: метод db.collection.find ()
Далее: метод db.collection.findOne ()
Новый контент: Composer: менеджер зависимостей для PHP , R программирования