Операції CRUD в MongoDB:
Що таке CRUD?
→
C - CREATE
R - READ
U - UPDATE
D - DELETE
Q Як відобразити список усіх баз даних, які зараз існують на сервері MongoDB?
$ show databases
Приклад:
C для Create (Створити)
Як створити базу даних у MongoDB?
Синтаксис:
> use database_name
Приклад: створення бази даних для Smart_Phone.
Q. Як вставити дані в MongoDB?
→ Операція вставки (Insert Operation):
Ця операція додасть нові документи до колекції. Якщо колекція не існує, операція вставки створить її.
Ви можете побачити, що в базі даних smart_phone немає колекцій.
Давайте подивимось, як створити колекцію всередині бази даних?
Щоразу, коли ми вставляємо щось, колекція буде створена лише в цей момент, а документи будуть вставлені в неї.
Синтаксис для операції вставки:
> db.collection.insert( { > db.collection.insertOne({
field: value, or field: value,
field: value field: value
} ) } )
Приклад:
Є два способи вставити документи в колекцію:
1. Використовуючи insertOne():
→ db.collection.insertOne() команда використовується для вставки одного документа за раз.
2. Використовуючи insertMany():
→ db.collection.insertMany() можна використовувати для вставки кількох документів одночасно в колекцію.
Q. Як вставити кілька документів?
→ за допомогою масиву ([]).
Синтаксис:
> db.collection.insert( [ або // db.collection.insertMany( [
{ document 1 },
{ document 2},
......
] )
Приклад:
Вставка кількох документів у колекцію.
> db.product_catalog.insert([
{
prodid: 7000002,
prodname: “iphone 8”,
manufacturer: “apple”,
categories: {main:”electronics”,sub:”smartphones”},
date_of_launch: new Date(“2017–09–07”),
price: 65000,
colors: [“silver”,”black”,”gold”,”rosegold”]
},
{
prodid: 7000003,
prodname: “iphone 9”,
manufacturer: “apple”,
categories: {main:”electronics”,sub:”smartphones”},
date_of_launch: new Date(“2018–09–07”),
price: 70000,
colors: [“silver”,”black”,”gold”,”rosegold”]
}
])
1-й приклад:
2-й приклад:
> db.product_catalog.insert (
[
{prodid:7000010,prodname:”nosql distilled”,publisher:”Addison-Wesley”,ISBN:1234567,price:400},
{prodid:7000011,prodname:”big data: principles and best practices”,publisher:”Dreamtech”,price:700}
]
)
Додаткові методи для вставки:
Наступні методи також можуть додавати нові документи до колекції:
db.collection.updateOne()
при використанні опціїupsert: true
.db.collection.updateMany()
при використанні опціїupsert: true
.db.collection.findAndModify()
при використанні опціїupsert: true
.db.collection.findOneAndUpdate()
при використанні опціїupsert: true
.db.collection.findOneAndReplace()
при використанні опціїupsert: true
.db.collection.bulkWrite()
.
Ми детальніше розглянемо ці методи пізніше в цьому блозі.
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
R для Read (Читати):
Q. Як отримати документи з колекції?
→ Використовуючи операцію find.
Синтаксис:
> db.collection.find(
{ query criteria },
{ projection criteria }
)
**findOne():** повертає лише один з найкращих документів з колекції.
![pic](https://drive.javascript.org.ua/e059bac87e1_WgHD9PgmbhxEBKyCyMIIVw_png)
**2. find():** покаже вам кілька документів з колекції.
Наприклад:
![pic](https://drive.javascript.org.ua/2254f5767e1_YSk6NLpi2cNXk6bxzVq8Ag_png)
- **Projection (Проекція):** Показує лише ті поля, які необхідні.
**Синтаксис:**
db.collection.find(
{ query criteria },
{ projection criteria }
)
```
1 --> щоб включити це поле
0 --> виключити це поле (усі поля, крім одного)
Примітка: В проекції можна включити або виключити поля, але не обидві операції одночасно в одному запиті проекції. (окрім випадку з _id: 0)
Простими словами це означає:
- { field1: 1, field2: 1} → допустимо
- { field1: 0, field2: 0} → допустимо
3. { field1: 1, field2: 1,_id:0} → допустимо (Виключення)
4. { field1: 1, field2: 0} → Недопустимо
Отримання документів на основі критеріїв:
Q. Як отримати документи, де prodname дорівнює ‘iphone 8’?
→
> db.product_catalog.find(
{prodname: "iphone 8"}
)
Q. Як отримати документи, що не містять поля colors або мають значення null для цього поля?
> db.product_catalog.find(
{ colors:null }
)
****** Використання перевірки на існування:**
> db.product_catalog.find(
{ colors: {"$exists":true} }
)
Якщо поле colors існує, документи будуть повернуті, в іншому випадку — не будуть.
Q. Як отримати вкладені документи?
→ Вкладений документ — це документ всередині документа.
Приклад:
Використовуючи . (крапку):
> db.product_catalog.find(
{ “categories.main”:”electronics” }
)
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
U для Update (Оновлення):
Операція Update дозволяє користувачам змінювати існуючі документи в колекції, коли відбуваються зміни. Потрібно вказати критерії або фільтр.
Синтаксис для оновлення документів:
MongoDB надає наступні методи для оновлення документів у колекції:
1 . db.collection.updateOne():
Оновлює лише один документ, що відповідає заданому фільтру, навіть якщо кілька документів можуть відповідати цьому фільтру.
2. db.collection.updateMany():
Оновлює всі документи, що відповідають заданому фільтру.
3.
db.collection.replaceOne():
замінює не більше одного документа, що відповідає заданому фільтру, навіть якщо кілька документів можуть відповідати цьому фільтру.
Приклади:
Для цього практичного прикладу я створюю нову базу даних під назвою ecommerce і вставляю документи в неї.
> use ecommerce
Тепер вставляю документи в колекцію products.
> db.products.insertMany(
[
{prodid:7000010,prodname:”nosql distilled”,publisher:”Addison-Wesley”,ISBN:1234567,price:400},
{prodid:7000011,prodname:”big data: principles and best practices”,publisher:”Dreamtech”,price:700},
{ prodid: 7000001,prodname: "iphone 7",manufacturer:"apple",
categories:{main:"electronics",sub:"smartphones"},
date_of_launch: new Date("2016-09-07"),price: 60000,
colors: ["silver","black","gold","rosegold"]},
{ prodid: 7000002,prodname: "iphone 8",manufacturer:"apple",
categories:{main:"electronics",sub:"smartphones"},
date_of_launch: new Date("2017-09-07"),price: 65000,
colors: ["silver","black","gold","white"]} ]
)
Оновлення одного документа на основі умови:
Оновіть prodname книги з “nosql distilled” на “NoSQL distilled”.
> db.products.updateOne(
{ prodname : "nosql distilled" },
{ $set : { "name" : "NoSQL distilled" }}
)
Ви можете перевірити, чи було оновлено.
*** Воно не було оновлено, воно було вставлено, оскільки поля name раніше не було.
> db.products.find(
{ prodname : "nosql distilled" }
)
Тепер я оновлюю знову 'name' → “NoSQL distilled” на “NoSQL”.
> db.products.updateOne(
{ prodname : "nosql distilled" },
{ $set : { "name" : "NoSQL" }}
)
Тепер перевірте, чи оновлено:
> db.products.find(
{ prodname : "nosql distilled" }
)
Оновлення кількох вкладених документів на основі умови:
Q. Оновіть sub в categories з smart phone на mobile phone, де manufacturer дорівнює apple.
> db.products.updateMany(
{ "manufacturer": "apple" },
{ $set : { "categories.sub" : "mobile phone" }}
)
Ви можете перевірити, чи було оновлено:
> db.products.find(
{ manufacturer : "apple" }
)
Замінити документ на основі умови:
> db.products.replaceOne( { “name” : “NoSQL” }, {"name":"Nosql distilled"})
Усі дані замінюються, як ви можете побачити в документі нижче:
Тепер знову я замінюю цей документ на початковий стан.
> db.products.replaceOne(
{name: "Nosql distilled"},
{prodid:7000010,prodname:”nosql distilled”,publisher:”Addison-Wesley”,ISBN:1234567,price:400}
);
Ви можете перевірити, чи був замінений на початковий:
> db.products.find(
{ prodname : "nosql distilled" }
)
Використання upsert для оновлення документів або вставки:
Ця операція оновлює всі документи з price, більшим за ‘80000’, та manufacturer рівним ‘apple’.
Якщо немає документів, які відповідають заданим критеріям, буде вставлений новий документ.
> db.product_catalog.updateMany(
{ “price” : { $gt : 80000 }, “manufacturer” : “apple” },
{ $set: { “prodname” : “iphone 7 plus” } },
{ upsert: true }
)
Ми можемо побачити це в базі даних ecommerce:
> db.products.find(
{ manufacturer : "apple" }
)
Оператори оновлення полів:
1. $inc: Збільшує значення поля на зазначену кількість.
Приклад:
Q. Збільшити price книги з ISBN ‘1979891’ на 20:
До збільшення ціни:
> db.products.find(
{ ISBN: 1234567}
)
Після виконання запиту значення буде збільшено, перевіримо:
> db.products.update(
{ ISBN: 1234567 },
{ $inc: { price: 20 } }
)
Для зменшення ціни ISBN:1234567 просто потрібно поставити (-) мінус перед значенням.
> db.products.update(
{ ISBN: 1234567 },
{ $inc: { price: -20 } }
)
2. $max: Оновлює поле тільки якщо вказане значення більше за поточне значення поля.
3. $min: Оновлює поле тільки якщо вказане значення менше за поточне значення поля.
Приклад:
Оновіть price продукту з ISBN ‘1234567’ до ‘430’, якщо нове значення більше за поточне:
> db.products.update(
{ ISBN: 1234567 },
{ $max: { price: 430 } }
)
Аналогічно, можна використовувати $min.
4. $mul: Множить значення поля на вказану кількість.
Помножте price продукту на ‘2’ для ISBN ‘1234567’:
db.products.update(
{ ISBN: 1234567 },
{ $mul: { price: 2} }
)
До множення:
Після множення:
5. $rename: Перейменовує поле.
Перейменуйте поле price в ‘Rs’ для ISBN ‘1234567’:
> db.products.update(
{ ISBN: 1234567 },
{ $rename: { "price": "Rs"} }
)
Перейменування назад ‘Rs’ на ‘price’:
6. $unset: Видаляє вказане поле з документа.
Давайте видалимо поле price з документа з ISBN ‘1234567’:
> db.products.update(
{ ISBN: 1234567 },
{ $unset: { "price": ""} }
)
7. Знову можна встановити ціну за допомогою оператора $set:
> db.products.update(
{ ISBN: 1234567 },
{ $set: { "price": 400} }
)
Оператори оновлення для масивів:
- dataset для оператора масивів:
> use student
Тепер вставимо ці документи в базу даних student в колекцію students.
> db.students.insertMany( [
{ “_id” : 1, “grades” : [85, 80, 80] },
{ “_id” : 2, “grades” : [88, 90, 92] },
{ “_id” : 3, “grades” : [85, 100, 90] }
] )
1.
$ : Використовується як заповнювач для оновлення першого елемента, який відповідає умовам запиту.
Синтаксис :
{ ".$" : value }
Приклад:
Щоб оновити перший елемент, значення якого дорівнює 80
, на 82
у масиві grades
, використовуйте позиційний оператор $
, якщо ви не знаєте позицію елемента в масиві:
> db.students.updateOne(
{ _id: 1, grades: 80 },
{ $set: { "grades.$" : 82 } }
)
До:
Після виконання запиту:
Якщо ви хочете змінити всі 80
на 82
, використовуйте оператор $[]
. Давайте розглянемо приклад у наступному розділі.
2. $[]: Використовується** як заповнювач для оновлення всіх елементів в масиві для документів, що відповідають умовам запиту.
Синтаксис :
{ ".$[]" : value }
Приклад:
- Встановити всі значення _id:2 на 80 за допомогою оператора $[].
> db.students.updateOne(
{ _id: 2 },
{ $set: { “grades.$[]” : 80 } }
)
Q. Щоб оновити всі елементи, значення яких дорівнює 80
, на 82
в масиві grades
, використовуйте позиційний оператор $[]
, якщо ви не знаєте позицію елемента в масиві:
> db.students.updateOne(
{ _id: 1, grades: 80 },
{ $set: { "grades.$[]" : 82} }
)
3. $[]: Використовується** як заповнювач для оновлення всіх елементів, які відповідають умові
arrayFilters
для документів, що відповідають умовам запиту.
Синтаксис:
> db.collection.updateMany(
{ },
{ : { “.$[]” : value } },
{ arrayFilters: [{ : }] }
)
Q. Щоб оновити всі елементи, які більші або рівні 85
в масиві grades
, використовуйте відфільтрований позиційний оператор $[]
з arrayFilters
.
> db.students.updateMany(
{ },
{ $set: { “grades.$[element]” : 100 } },
{ arrayFilters: [{ “element”: { $gte: 85} }] }
)
*** У цьому операторі, якщо запит не задовольняється (документ не знайдено), буде виконано upsert документа.
4.$addToSet: Додає елементи до масиву лише у тому випадку, якщо їх ще немає в наборі.
Синтаксис:
> { $addToSet: { : , … } }
Приклад : -
Ми будемо використовувати базу даних ecommerce та колекцію products:
>use ecommerce
Тепер ви можете побачити, що деякі кольори для iphone 7 вже існують у полі масиву colors.
Я додаю ‘pink’ в масив кольорів за допомогою оператора $addToSet.
> db.products.update({“prodname”: “iphone 7”},{$addToSet:{colors:’pink’}})
5. $pop: Видаляє перший або останній елемент з масиву.
Синтаксис:
> { $pop: { : <-1 | 1>, … } }
-1 --> для першого елемента масиву.
1 --> для останнього елемента масиву.
Приклад:
Видалення першого кольору iphone 7:
> db.products.update({“prodname”: “iphone 7”},{$pop:{colors:-1}})
Видалення останнього кольору iphone 7.
> db.products.update({“prodname”: “iphone 7”},{$pop:{colors:1}})
6.
$push: Додає елемент до масиву.
Оператор $push
додає вказане значення до масиву.
Синтаксис:
> { $push: { : , … } }
Приклад:
Додавання ‘blue’ в colors для iphone 7:
> db.products.update({“prodname”: “iphone 7”},
{$push:{colors:"blue"}})
7. $pull: Видаляє всі елементи масиву, що відповідають вказаному запиту.
Синтаксис:
> { $pull: { : , : , … } }
Приклад: -
Видалення “black” та “gold” з масиву colors для iphone 7:
> db.products.updateOne( { “prodname”: “iphone 7”}, { $pull: { colors: { $in: ["black", "gold"] } } })
8. $pullAll: Видаляє всі відповідні значення з масиву.
Оператор $pullAll
видаляє всі екземпляри вказаних значень з існуючого масиву. На відміну від оператора $pull
, який видаляє елементи за допомогою запиту, $pullAll
видаляє елементи, що відповідають перерахованим значенням.
Синтаксис:
>{ $pullAll: { : [, …], … } }
Приклад:
> db.products.update( { “prodname”: “iphone 7”}, { $pullAll: { colors: [“blue”, “rosegold”] } } })
D Для Видалення:
Операція Видалення:
Операція Delete дозволяє видаляти документи з колекції, які більше не є дійсними. Ви можете вказати критерії або фільтри для видалення документів.
- MongoDB надає наступні методи для видалення документа:
- db.collection.deleteOne(): Видаляє не більше одного документа, що відповідає вказаному фільтру, навіть якщо кілька документів відповідають вказаному фільтру.
Приклад:
Видалити лише один документ, що відповідає умові:
- Для цієї операції ми будемо використовувати базу даних ecommerce та колекцію products.
> use ecommerce
Ви можете побачити, що колекція products містить наступні документи.
> db.products.find({})
Q. Видалити документ з колекції products, де “prodname” дорівнює “iphone 7”.
> db.products.deleteOne({prodname:iphone7})
Після видалення документа, ви побачите колекцію знову, і вона буде видалена.
- db.collection.deleteMany(): Видаляє всі документи, що відповідають вказаному фільтру.
Приклад:
Видалити всі документи, що відповідають умові:
Q. Видалити документи з колекції products, де “manufacturer” дорівнює “apple”.
> db.produts.deleteMany({"manufacturer":"apple"})
Подивимося на це на практиці:
До того як колекція виглядала так:
Після видалення всіх документів, де “manufacturer” дорівнює “apple”.
> db.produts.deleteMany({"manufacturer":"apple"})
Видалити всі документи:
- Щоб видалити всі документи з колекції, передайте порожній фільтрний документ
{}
методуdb.collection.deleteMany()
.
> db.products.deleteMany({})
3.
db.collection.remove(): Видаляє один документ або всі документи, що відповідають вказаному фільтру.
Звичайний синтаксис:
> db.collection.remove( , )
Синтаксис:
> db.collection.remove( ,
{ justOne: ,
writeConcern: ,
collation: ,
let: // Додано в MongoDB 5.0
}
- Видалити один документ з колекції, що відповідає запиту :
> db.collection.remove( , true )
- Видалити всі документи з колекції, що відповідають запиту:
> db.collection.remove( )
- Видалити всі документи з колекції:
> db.collection.remove({})
Якщо ви хочете дізнатися більше про оператори, ви можете прочитати цей блог.
Дякую…
Перекладено з: Node.js : Day 13