128 lines
6.0 KiB
Markdown
128 lines
6.0 KiB
Markdown
# 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. Связь только в названии коллекций
|
||
```
|
||
|
||
Из ограниченных коллекций нельзя удалять документы
|