This repository has been archived on 2024-08-23. You can view files and clone it, but cannot push or open issues or pull requests.
lessons/Mongo/Mongo.md
2024-07-21 12:04:29 +03:00

128 lines
6.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# MongoDB
## Установка
Воспользуйтесь докером, бога ради
## Команды
```js
use test
db.users.insertOne({name: "Nick", languages: ["eng", "ger"]})
db.users.insertMany([{name: "Nick"}, {name: "Bob"}])
db.users.insertOne({name: "Alex", company: {
name: "Microsoft",
country: "USA"
}})
db.users.insertOne({name: "Bob Jr", courses: [{name: "Mongo", grade: 3}, {name: "postgres", grade:5}]})
load("/users.js") // Выполняет все опреции из файла
db.users.find()
db.users.findOne()
db.users.find({name: "Bob", languages: null}) // Вывести всех Бобов без языка
db.users.find({languages: ["eng", "ger"]}) // Есть английский и немецкий в таком порядке
db.users.find({"languages.0": "eng"}) // eng на первом месте
db.users.find({}, {name: 1}) // Вывести только имя и _id
db.users.find({}, {name: true, _id: false}) // Вывести всё кроме name и _id
// true == 1 && false == 0
db.users.find({"company.name": "Microsoft"})
db.users.find().skip(2).limit(3)
db.users.find().sort({name: 1})
db.users.find().sort({$natural: -1}).limit(5) // Последние 5 документов
db.users.find({}, {languages: {$slice: 1}}) // 1 первый элемент
db.users.find({}, {languages: {$slice: -1}}) // 1 последний элемент
db.users.find({}, {languages: {$slice: [-1, 2]}}) // Вернуть последний и первый элементы. Первый - сколько скипнуть, второй - сколько взять
db.users.find().count() // Кол-во элементов
db.users.find().skip(2).count(true) // Если используем skip или limit передаём в count true
db.users.distinct("name") // Список уникальных имён
db.users.find({age: {$gt: 30, $lt: 50}})
db.users.find({age: {$in: [22, 32]}});
db.users.find({$or: [name: "Nick", age:22]})
db.users.find({languages: {$all: ["eng", "ger"]}}) // Найти всех пользователей, у которых есть и eng, и ger в языках (могут быть ещё). Порядок не важен
db.users.find({courses: {$elemMatch: {name: "Mongo", grade: {$gt: 2}}}}) // Все пользователи у которых есть курс по монго с оценкой выше 2
db.users.find({courses: {$size: 2}}) // Все пользователи с 2 курсами
db.users.find({name: {$exists: true}})
db.users.find({name: {$type: "string"}})
db.users.find({name: {$regex: "om$"}})
db.users.replaceOne({name: "Tom"}, {name: "Bob", age: 2}, {upsert: true}) //Полностью заменяет документ. Если upsert true, то документ будет создан, если не найдёт
db.users.updateOne({name: "Tom"}, {$set: {salary: 300}, $inc: {age: 2}})
db.users.updateOne({name: "Tom"}, {$unset: {salary: 1}}) // Установить salary
db.users.updateOne({name: "Tom"}, {$push: {languages: "rus"}})
db.users.updateOne({name: "Tom"}, {$push: {languages: {$each: ["lang1", "lang2"]}}})
db.users.updateOne({name: "Tom"}, {$push: {languages: {$each: ["lang3", "lang4"], $position: 1, $slice: 5}}}) // Вставит с первого индекса и оставит только 5 элементов
db.users.updateOne({name: "Tom"}, {$addToSet: {languages: "rus"}}) // Push без дупликатов
db.users.updateOne({name: "Tom"}, {$pop: {languages: 1}}) // Удалить последний
db.users.updateOne({name: "Tom"}, {$pop: {languages: -1}}) // Удалить первый
db.users.updateOne({name: "Tom"}, {$pull: {languages: "eng"}}) // Удалить eng из языков
db.users.updateOne({name: "Tom"}, {$pullAll: {languages: ["eng", "rus"]}})
db.users.deleteOne({name: "Bob"})
db.users.deleteMany({name: /B\w+/i})
db.users.drop()
db.dropDatabase()
```
## Курсоры
```js
var cursor = db.users.find()
while(cursor.hasNext()) {
print(cursor.next().name);
}
db.users.find().forEach(user => print(user.name));
cursor = db.users.find();
cursor.limit(5);null; // Поставить лимит без вывода данных
```
## Условные операторы
* $eq
* $ne
* $gt
* $lt
* $gte
* $lte
* $in
* $nin
* $or
* $and
* $not
* $nor
## Поиск по массивам
* $all - определяет набор значений, все из которых должны быть в массиве
* $size - орпделяет кол-во элементов
* $elemMatch - определяет условие, которым должны соответсвовать элементы в массиве
## Связывание документов
```js
google = db.companies.insertOne({name: "google", year: 1998})
sam = ({name: "Sam", age: 25, company: {$ref: "companies", $id: google.insertedId}})
db.users.insertOne(sam)
db.companies.findOne({_id: sam.company.$id})
```
## Индексы
```js
db.users.createIndex({"name": 1})
db.users.createIndex({"name": 1}, {"unique": true})
db.users.createIndex({"name": 1, "age": 1}, {"unique": true})
db.users.getIndexes()
db.users.dropIndex("name_1") // По названию из getIndexes
```
## Работа с коллекциями
```js
db.createCollection("accounts")
db.accounts.renameCollection("super_puper_users")
db.createCollection("profiles", {capped: true, size: 9500}) // Фиксированный размер в байтах. В случае переполнения удаляются старые. Гарантируется, что порядок выдачи такой же как и порядок вставки
db.createCollection("profiles", {capped: true, size: 9500, max: 150}) // Ещё ограничили кол-во документов
db.users.profiles.insertOne({"bio": "I'm a programmer"}) // Создаёт коллекцию users.profiles. Связь только в названии коллекций
```
Из ограниченных коллекций нельзя удалять документы