Node.js : День 13

pic

Операції CRUD в MongoDB:

Що таке CRUD?

C - CREATE  

R - READ  

U - UPDATE  

D - DELETE

Q Як відобразити список усіх баз даних, які зараз існують на сервері MongoDB?

$ show databases

Приклад:

pic

C для Create (Створити)

Як створити базу даних у MongoDB?

Синтаксис:

> use database_name

Приклад: створення бази даних для Smart_Phone.

pic

Q. Як вставити дані в MongoDB?

→ Операція вставки (Insert Operation):

Ця операція додасть нові документи до колекції. Якщо колекція не існує, операція вставки створить її.

Ви можете побачити, що в базі даних smart_phone немає колекцій.

pic

Давайте подивимось, як створити колекцію всередині бази даних?

Щоразу, коли ми вставляємо щось, колекція буде створена лише в цей момент, а документи будуть вставлені в неї.

Синтаксис для операції вставки:

> db.collection.insert( { > db.collection.insertOne({  
 field: value, or field: value,  
 field: value field: value  
 } ) } )

Приклад:

pic

Є два способи вставити документи в колекцію:

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-й приклад:

pic

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

pic

Додаткові методи для вставки:

Наступні методи також можуть додавати нові документи до колекції:

  • 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)

Простими словами це означає:

  1. { field1: 1, field2: 1} → допустимо

pic

  1. { field1: 0, field2: 0} → допустимо

pic

3. { field1: 1, field2: 1,_id:0} → допустимо (Виключення)

pic

4. { field1: 1, field2: 0} → Недопустимо

pic

pic

Отримання документів на основі критеріїв:

Q. Як отримати документи, де prodname дорівнює ‘iphone 8’?

> db.product_catalog.find(  
 {prodname: "iphone 8"}  
)

pic

Q. Як отримати документи, що не містять поля colors або мають значення null для цього поля?

> db.product_catalog.find(  
 { colors:null }  
)

****** Використання перевірки на існування:**

> db.product_catalog.find(  
 { colors: {"$exists":true} }  
)

Якщо поле colors існує, документи будуть повернуті, в іншому випадку — не будуть.

Q. Як отримати вкладені документи?

→ Вкладений документ — це документ всередині документа.

Приклад:

pic

Використовуючи . (крапку):

> db.product_catalog.find(  
 { “categories.main”:”electronics” }  
)

pic

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — —

U для Update (Оновлення):

Операція Update дозволяє користувачам змінювати існуючі документи в колекції, коли відбуваються зміни. Потрібно вказати критерії або фільтр.

Синтаксис для оновлення документів:

pic

MongoDB надає наступні методи для оновлення документів у колекції:

pic

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

pic

Ви можете перевірити, чи було оновлено.

*** Воно не було оновлено, воно було вставлено, оскільки поля name раніше не було.

> db.products.find(  
 { prodname : "nosql distilled" }  
)

pic

Тепер я оновлюю знову 'name' → “NoSQL distilled” на “NoSQL”.

> db.products.updateOne(  
 { prodname : "nosql distilled" },  
 { $set : { "name" : "NoSQL" }}  
)

pic

Тепер перевірте, чи оновлено:

> db.products.find(  
 { prodname : "nosql distilled" }  
)

pic

Оновлення кількох вкладених документів на основі умови:

Q. Оновіть sub в categories з smart phone на mobile phone, де manufacturer дорівнює apple.

> db.products.updateMany(  
 { "manufacturer": "apple" },  
 { $set : { "categories.sub" : "mobile phone" }}  
)

pic

Ви можете перевірити, чи було оновлено:

> db.products.find(  
 { manufacturer : "apple" }  
)

pic

Замінити документ на основі умови:

> db.products.replaceOne( { “name” : “NoSQL” }, {"name":"Nosql distilled"})

pic

Усі дані замінюються, як ви можете побачити в документі нижче:

pic

Тепер знову я замінюю цей документ на початковий стан.

> db.products.replaceOne(  
 {name: "Nosql distilled"},  
 {prodid:7000010,prodname:”nosql distilled”,publisher:”Addison-Wesley”,ISBN:1234567,price:400}   
);

pic

Ви можете перевірити, чи був замінений на початковий:

> db.products.find(  
 { prodname : "nosql distilled" }  
)

pic

Використання upsert для оновлення документів або вставки:

Ця операція оновлює всі документи з price, більшим за ‘80000’, та manufacturer рівним ‘apple’.
Якщо немає документів, які відповідають заданим критеріям, буде вставлений новий документ.

> db.product_catalog.updateMany(  
 { “price” : { $gt : 80000 }, “manufacturer” : “apple” },  
 { $set: { “prodname” : “iphone 7 plus” } },  
 { upsert: true }   
)

pic

Ми можемо побачити це в базі даних ecommerce:

> db.products.find(  
 { manufacturer : "apple" }  
)

pic

Оператори оновлення полів:

1. $inc: Збільшує значення поля на зазначену кількість.

Приклад:

Q. Збільшити price книги з ISBN ‘1979891’ на 20:

До збільшення ціни:

pic

> db.products.find(  
 { ISBN: 1234567}  
)

pic

Після виконання запиту значення буде збільшено, перевіримо:

> db.products.update(  
 { ISBN: 1234567 },  
 { $inc: { price: 20 } }  
)

pic

Для зменшення ціни ISBN:1234567 просто потрібно поставити (-) мінус перед значенням.

> db.products.update(  
 { ISBN: 1234567 },  
 { $inc: { price: -20 } }  
)

pic

2. $max: Оновлює поле тільки якщо вказане значення більше за поточне значення поля.

3. $min: Оновлює поле тільки якщо вказане значення менше за поточне значення поля.

Приклад:

Оновіть price продукту з ISBN ‘1234567’ до ‘430’, якщо нове значення більше за поточне:

> db.products.update(  
 { ISBN: 1234567 },  
 { $max: { price: 430 } }  
)

pic

pic

Аналогічно, можна використовувати $min.

4. $mul: Множить значення поля на вказану кількість.

Помножте price продукту на ‘2’ для ISBN ‘1234567’:

db.products.update(  
 { ISBN: 1234567 },  
 { $mul: { price: 2} }  
)

До множення:

pic

Після множення:

pic

5. $rename: Перейменовує поле.

Перейменуйте поле price в ‘Rs’ для ISBN ‘1234567’:

> db.products.update(  
 { ISBN: 1234567 },  
 { $rename: { "price": "Rs"} }  
)

pic

Перейменування назад ‘Rs’ на ‘price’:

pic

6. $unset: Видаляє вказане поле з документа.

Давайте видалимо поле price з документа з ISBN ‘1234567’:

> db.products.update(  
 { ISBN: 1234567 },  
 { $unset: { "price": ""} }  
)

pic

7. Знову можна встановити ціну за допомогою оператора $set:

> db.products.update(  
 { ISBN: 1234567 },  
 { $set: { "price": 400} }  
)

pic

Оператори оновлення для масивів:

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

pic

1.
$ :
Використовується
як заповнювач для оновлення першого елемента, який відповідає умовам запиту.

Синтаксис :

{ ".$" : value }

Приклад:

Щоб оновити перший елемент, значення якого дорівнює 80, на 82 у масиві grades, використовуйте позиційний оператор $, якщо ви не знаєте позицію елемента в масиві:

> db.students.updateOne(  
 { _id: 1, grades: 80 },  
 { $set: { "grades.$" : 82 } }  
)

До:

pic

Після виконання запиту:

pic

Якщо ви хочете змінити всі 80 на 82, використовуйте оператор $[]. Давайте розглянемо приклад у наступному розділі.

2. $[]: Використовується** як заповнювач для оновлення всіх елементів в масиві для документів, що відповідають умовам запиту.

Синтаксис :

{ ".$[]" : value }

Приклад:

  • Встановити всі значення _id:2 на 80 за допомогою оператора $[].
> db.students.updateOne(  
 { _id: 2 },   
 { $set: { “grades.$[]” : 80 } }   
)

pic

Q. Щоб оновити всі елементи, значення яких дорівнює 80, на 82 в масиві grades, використовуйте позиційний оператор $[], якщо ви не знаєте позицію елемента в масиві:

> db.students.updateOne(  
 { _id: 1, grades: 80 },  
 { $set: { "grades.$[]" : 82} }  
)

pic

3. $[]: Використовується** як заповнювач для оновлення всіх елементів, які відповідають умові arrayFilters для документів, що відповідають умовам запиту.

Синтаксис:

> db.collection.updateMany(  
 {  },  
 { : { “.$[]” : value } },  
 { arrayFilters: [{ :  }] }  
)

Q. Щоб оновити всі елементи, які більші або рівні 85 в масиві grades, використовуйте відфільтрований позиційний оператор $[] з arrayFilters.

> db.students.updateMany(  
 { },  
 { $set: { “grades.$[element]” : 100 } },  
 { arrayFilters: [{ “element”: { $gte: 85} }] }  
)

pic

*** У цьому операторі, якщо запит не задовольняється (документ не знайдено), буде виконано upsert документа.

4.$addToSet: Додає елементи до масиву лише у тому випадку, якщо їх ще немає в наборі.

Синтаксис:

> { $addToSet: { : , … } }

Приклад : -

Ми будемо використовувати базу даних ecommerce та колекцію products:

>use ecommerce

Тепер ви можете побачити, що деякі кольори для iphone 7 вже існують у полі масиву colors.

pic

Я додаю ‘pink’ в масив кольорів за допомогою оператора $addToSet.

> db.products.update({“prodname”: “iphone 7”},{$addToSet:{colors:’pink’}})

pic

pic

5. $pop: Видаляє перший або останній елемент з масиву.

Синтаксис:

> { $pop: { : <-1 | 1>, … } }
-1 --> для першого елемента масиву.  
 1 --> для останнього елемента масиву.

Приклад:

Видалення першого кольору iphone 7:

> db.products.update({“prodname”: “iphone 7”},{$pop:{colors:-1}})

pic

Видалення останнього кольору iphone 7.

> db.products.update({“prodname”: “iphone 7”},{$pop:{colors:1}})

pic

6.
$push:
Додає елемент до масиву.

Оператор $push додає вказане значення до масиву.

Синтаксис:

> { $push: { : , … } }

Приклад:

Додавання ‘blue’ в colors для iphone 7:

> db.products.update({“prodname”: “iphone 7”},  
{$push:{colors:"blue"}})

pic

7. $pull: Видаляє всі елементи масиву, що відповідають вказаному запиту.

Синтаксис:

> { $pull: { : , : , … } }

Приклад: -

Видалення “black” та “gold” з масиву colors для iphone 7:

> db.products.updateOne( { “prodname”: “iphone 7”}, { $pull: { colors: { $in: ["black", "gold"] } } })

pic

8. $pullAll: Видаляє всі відповідні значення з масиву.

Оператор $pullAll видаляє всі екземпляри вказаних значень з існуючого масиву. На відміну від оператора $pull, який видаляє елементи за допомогою запиту, $pullAll видаляє елементи, що відповідають перерахованим значенням.

Синтаксис:

>{ $pullAll: { : [,  …], … } }

Приклад:

> db.products.update( { “prodname”: “iphone 7”}, { $pullAll: { colors: [“blue”, “rosegold”] } } })

pic

D Для Видалення:

Операція Видалення:

Операція Delete дозволяє видаляти документи з колекції, які більше не є дійсними. Ви можете вказати критерії або фільтри для видалення документів.

  • MongoDB надає наступні методи для видалення документа:
  1. db.collection.deleteOne(): Видаляє не більше одного документа, що відповідає вказаному фільтру, навіть якщо кілька документів відповідають вказаному фільтру.

Приклад:

Видалити лише один документ, що відповідає умові:

  • Для цієї операції ми будемо використовувати базу даних ecommerce та колекцію products.
> use ecommerce

Ви можете побачити, що колекція products містить наступні документи.

> db.products.find({})

pic

pic

Q. Видалити документ з колекції products, де “prodname” дорівнює “iphone 7”.

> db.products.deleteOne({prodname:iphone7})

Після видалення документа, ви побачите колекцію знову, і вона буде видалена.

pic

pic

  1. db.collection.deleteMany(): Видаляє всі документи, що відповідають вказаному фільтру.

Приклад:

Видалити всі документи, що відповідають умові:

Q. Видалити документи з колекції products, де “manufacturer” дорівнює “apple”.

> db.produts.deleteMany({"manufacturer":"apple"})

Подивимося на це на практиці:

До того як колекція виглядала так:

pic

Після видалення всіх документів, де “manufacturer” дорівнює “apple”.

> db.produts.deleteMany({"manufacturer":"apple"})

pic

Видалити всі документи:

  • Щоб видалити всі документи з колекції, передайте порожній фільтрний документ {} методу db.collection.deleteMany().
> db.products.deleteMany({})

pic

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

Leave a Reply

Your email address will not be published. Required fields are marked *