MongoDB: запрос, обновление и удаление документа

Предыдущая часть: “MongoDB: вставка документа

Запрос документа

Метод find() 

Метод find() запрашивает данные из коллекции MongoDB. 

Синтаксис 

Ниже представлен основной синтаксис find()

>db.COLLECTION_NAME.find()

Данный метод отображает все документы в неструктурированном виде. 

Пример 

Допустим, мы создали коллекцию с именем mycol

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

Затем с помощью метода insert() вставили в нее 3 документа: 

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

find() извлекает все документы из коллекции:

> db.mycol.find()
{ "_id" : ObjectId("5dd4e2cc0821d3b44607534c"), "title" : "MongoDB Overview", "description" : "MongoDB is no SQL database", "by" : "NOP", "url" : "https://nuancesprog.ru", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
{ "_id" : ObjectId("5dd4e2cc0821d3b44607534d"), "title" : "NoSQL Database", "description" : "NoSQL database doesn't have tables", "by" : "NOP", "url" : "https://nuancesprog.ru", "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" : "NOP",
"url" : "https://nuancesprog.ru",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
{
"_id" : ObjectId("5dd4e2cc0821d3b44607534d"),
"title" : "NoSQL Database",
"description" : "NoSQL database doesn't have tables",
"by" : "NOP",
"url" : "https://nuancesprog.ru",
"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 Overview: 

> db.mycol.findOne({title: "MongoDB Overview"})
{
"_id" : ObjectId("5dd6542170fb13eec3963bf0"),
"title" : "MongoDB Overview",
"description" : "MongoDB is no SQL database",
"by" : "NOP",
"url" : "https://nuancesprog.ru",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}

Эквиваленты оператора Where (РСУБД) в MongoDB

Ниже представлен перечень операций для запроса документа на основании условия: 

AND в MongoDB

Синтаксис 

Для запроса документов на основе условия AND используется ключевое слово $and. Рассмотрим основной синтаксис AND

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

Пример

Отобразим все учебные материалы, которые созданы компанией ‘NOP’ и называются ‘MongoDB Overview’:

> db.mycol.find({$and:[{"by":"NOP"},{"title": "MongoDB Overview"}]}).pretty()
{
"_id" : ObjectId("5dd4e2cc0821d3b44607534c"),
"title" : "MongoDB Overview",
"description" : "MongoDB is no SQL database",
"by" : "NOP",
"url" : "https://nuancesprog.ru",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
>

Для указанного примера эквивалентом оператора where будет ‘ where by = ‘nop’ AND title = ‘MongoDB Overview’ ‘. В оператор find можно передать любое количество пар “ключ-значение”. 

OR в MongoDB

Синтаксис 

Запрос документов на основе условия OR выполняется с помощью ключевого слова $or. Ниже представлен основной синтаксис OR

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

Пример 

Отобразим все учебные материалы, которые созданы компанией ‘NOP’ или называются ‘MongoDB Overview’:

>db.mycol.find({$or:[{"by":"NOP"},{"title": "MongoDB Overview"}]}).pretty()
{
"_id": ObjectId(7df78ad8902c),
"title": "MongoDB Overview",
"description": "MongoDB is no sql database",
"by": "NOP",
"url": "https://nuancesprog.ru",
"tags": ["mongodb", "database", "NoSQL"],
"likes": "100"
}
>

Совместное использование AND и OR

Пример 

Данный фрагмент кода отображает документы со следующими характеристиками: 

  • лайков больше 10;
  • созданы компанией ‘NOP’;
  • называются ‘MongoDB Overview’. 

Эквивалентом оператора where SQL является ‘where likes>10 AND (by = ‘NOP’ OR title = ‘MongoDB Overview’)’.

>db.mycol.find({"likes": {$gt:10}, $or: [{"by": "NOP"},
{"title": "MongoDB Overview"}]}).pretty()
{
"_id": ObjectId(7df78ad8902c),
"title": "MongoDB Overview",
"description": "MongoDB is no sql database",
"by": "NOP",
"url": "https://nuancesprog.ru",
"tags": ["mongodb", "database", "NoSQL"],
"likes": "100"
}
>

NOR в MongoDB

Синтаксис 

Для запроса документов на основе условия NOT используется ключевое слово $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"
}
]
)

Извлечем документы, имя которых не является “Radhika” и фамилия  —  не “Christopher”:  

> 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"
}

NOT в MongoDB

Синтаксис 

Для запроса документа на основе условия NOT требуется ключевое слово $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"
}

Обновление документа

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

Метод Update()

update() обновляет значения в существующем документе.

Синтаксис

Ниже представлен основной синтаксис update():

>db.COLLECTION_NAME.update(SELECTION_CRITERIA, UPDATED_DATA)

Пример

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

{ "_id" : ObjectId(5983548781331adf45ec5), "title":"MongoDB Overview"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"NOP Overview"}

Присвоим новое название ‘New MongoDB Tutorial’ документам, озаглавленным ‘MongoDB Overview’.

>db.mycol.update({'title':'MongoDB Overview'},{$set:{'title':'New MongoDB Tutorial'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
>db.mycol.find()
{ "_id" : ObjectId(5983548781331adf45ec5), "title":"New MongoDB Tutorial"}
{ "_id" : ObjectId(5983548781331adf45ec6), "title":"NoSQL Overview"}
{ "_id" : ObjectId(5983548781331adf45ec7), "title":"NOP Overview"}
>

По умолчанию MongoDB обновит только один документ. Если ваша цель — несколько документов, то задаем параметру multi значение true.

>db.mycol.update({'title':'MongoDB Overview'},
{$set:{'title':'New MongoDB Tutorial'}},{multi:true})

Метод Save()

save() заменяет имеющийся документ новым документом, переданным в метод save().

Синтаксис

Ниже представлен основной синтаксис save():

>db.COLLECTION_NAME.save({_id:ObjectId(),NEW_DATA})

Пример

Заменим документ с _id ‘5983548781331adf45ec5’.

>db.mycol.save(
{
"_id" : ObjectId("507f191e810c19729de860ea"),
"title":"NOP New Topic",
"by":"NOP"
}
)
WriteResult({
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("507f191e810c19729de860ea")
})
>db.mycol.find()
{ "_id" : ObjectId("507f191e810c19729de860e6"), "title":"NOP New Topic",
"by":"NOP"}
{ "_id" : ObjectId("507f191e810c19729de860e6"), "title":"NoSQL Overview"}
{ "_id" : ObjectId("507f191e810c19729de860e6"), "title":"NOP Overview"}
>

Метод findOneAndUpdate()

findOneAndUpdate() обновляет значения в существующем документе.

Синтаксис

Ниже представлен основной синтаксис findOneAndUpdate():

>db.COLLECTION_NAME.findOneAndUpdate(SELECTIOIN_CRITERIA, UPDATED_DATA)

Пример

Допустим, мы создали коллекцию с именем empDetails и вставили в нее 3 документа:

> 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"
}
]
)

Обновим значения age и email документа с именем ‘Radhika’.

> db.empDetails.findOneAndUpdate(
{First_Name: 'Radhika'},
{ $set: { Age: '30',e_mail: '[email protected]'}}
)
{
"_id" : ObjectId("5dd6636870fb13eec3963bf5"),
"First_Name" : "Radhika",
"Last_Name" : "Sharma",
"Age" : "30",
"e_mail" : "[email protected]",
"phone" : "9000012345"
}

Метод updateOne()

updateOne() обновляет один документ, соответствующий заданному фильтру (filter).

Синтаксис

Ниже представлен основной синтаксис updateOne():

>db.COLLECTION_NAME.updateOne(<filter>, <update>)

Пример

> db.empDetails.updateOne(
{First_Name: 'Radhika'},
{ $set: { Age: '30',e_mail: '[email protected]'}}
)
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 0 }
>

Метод updateMany()

updateMany() обновляет все документы, соответствующие фильтру.

Синтаксис

Ниже представлен основной синтаксис updateMany():

>db.COLLECTION_NAME.update(<filter>, <update>)

Пример

> db.empDetails.updateMany(
{Age:{ $gt: "25" }},
{ $set: { Age: '00'}}
)
{ "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 2 }

Если извлечь содержимое документа методом find, можно увидеть обновленные значения.

> db.empDetails.find()
{ "_id" : ObjectId("5dd6636870fb13eec3963bf5"), "First_Name" : "Radhika", "Last_Name" : "Sharma", "Age" : "00", "e_mail" : "[email protected]", "phone" : "9000012345" }
{ "_id" : ObjectId("5dd6636870fb13eec3963bf6"), "First_Name" : "Rachel", "Last_Name" : "Christopher", "Age" : "00", "e_mail" : "[email protected]", "phone" : "9000054321" }
{ "_id" : ObjectId("5dd6636870fb13eec3963bf7"), "First_Name" : "Fathima", "Last_Name" : "Sheik", "Age" : "24", "e_mail" : "[email protected]", "phone" : "9000054321" }
>

Удаление документа

Метод remove()

В MongoDB для удаления документов существует метод remove(). Он принимает два параметра: один  —  критерий удаления (deletion criteria), второй  —  флаг justOne.

  • критерий удаления (необязательный параметр) определяет документы, подлежащие удалению
  • justOne (необязательный параметр) при значении true или 1 удаляет только один документ.

Синтаксис

Ниже представлен основной синтаксис remove():

>db.COLLECTION_NAME.remove(DELLETION_CRITTERIA)

Пример

Предположим, что коллекция mycol содержит данные:

{_id : ObjectId("507f191e810c19729de860e1"), title: "MongoDB Overview"},
{_id : ObjectId("507f191e810c19729de860e2"), title: "NoSQL Overview"},
{_id : ObjectId("507f191e810c19729de860e3"), title: "NOP Overview"}

Удалим все документы с названием ‘MongoDB Overview’:

>db.mycol.remove({'title':'MongoDB Overview'})
WriteResult({"nRemoved" : 1})
> db.mycol.find()
{"_id" : ObjectId("507f191e810c19729de860e2"), "title" : "NoSQL Overview" }
{"_id" : ObjectId("507f191e810c19729de860e3"), "title" : "NOP Overview" }

Удаление только одной записи

Если из ряда имеющихся записей нужно удалить только первую, то в методе remove() устанавливается параметр justOne

>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)

Удаление всех документов

При отсутствии критерия удаления MongoDB удаляет все документы из коллекции. По действию эта операция аналогична команде truncate в SQL.

> db.mycol.remove({})
WriteResult({ "nRemoved" : 2 })
> db.mycol.find()
>

Читайте также:

Читайте нас в TelegramVK и Яндекс.Дзен

Предыдущая статьяРазрабатываем приложения для распознавания речи с помощью Python
Следующая статьяЯзык C: константы и литералы