Предыдущая часть: “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()
>
Читайте также:
- Введение в Pulumi
- Создание архитектур кода с помощью функциональных операторов
- MongoDB: моделирование данных
Читайте нас в Telegram, VK и Яндекс.Дзен