digitalization-2025-10/mongo.md

112 lines
3.9 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: установка и базовое использование
Краткая инструкция по установке MongoDB на Windows и запуску в Docker, подключению через `mongosh` и базовым операциям.
## Вариант A: Docker (рекомендуется для практикума)
```bash
# Запуск MongoDB (порт 27017), создание пользователя root
# Замените StrongPass! на свой пароль
docker run -d --name mongo -p 27017:27017 -e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=StrongPass! -v mongo_data:/data/db mongo:7
```
Подключение `mongosh` (если установлен локально):
```bash
mongosh "mongodb://root:StrongPass!@localhost:27017/?authSource=admin"
```
Создание приложения БД/пользователя:
```javascript
use appdb
db.createUser({
user: "appuser",
pwd: "AppUserPass!",
roles: [ { role: "readWrite", db: "appdb" } ]
})
```
Проверка записи/чтения:
```javascript
db.items.insertOne({ name: "sensor-1", type: "pressure", value: 28.5 })
db.items.find()
```
Останов/старт/удаление контейнера:
```bash
docker stop mongo && docker start mongo && docker rm -f mongo
```
## Полезные команды `mongosh`
```javascript
// Показать базы/коллекции
show dbs
use appdb
show collections
// CRUD
db.devices.insertMany([{name:"compressor-A", status:"online"},{name:"compressor-B", status:"offline"}])
db.devices.find({status:"online"})
db.devices.updateOne({name:"compressor-B"}, {$set: {status:"online"}})
db.devices.deleteOne({name:"compressor-A"})
// Индекс
db.devices.createIndex({status:1})
// Фильтры (сравнение, логика, диапазоны)
db.devices.find({status: {$in: ["online", "maintenance"]}})
db.readings.find({value: {$gte: 10, $lt: 50}})
db.readings.find({$and: [{type:"pressure"}, {value: {$gt: 100}}]})
// Проекция полей (включение/исключение)
db.devices.find({}, {name:1, status:1, _id:0})
// Сортировка, лимит, пропуск
db.readings.find({type:"temperature"}).sort({timestamp:-1}).limit(10)
db.readings.find({type:"temperature"}).sort({timestamp:1}).skip(20).limit(10)
// Составной запрос: фильтр + проекция + сортировка + пагинация
db.devices.find({status:"online"}, {name:1, status:1, _id:0}).sort({name:1}).skip(0).limit(5)
// Поддокументы/массивы
db.wells.insertOne({name:"Well-1001", sensors:[{type:"pressure", value:2800},{type:"temperature", value:85}]})
db.wells.find({"sensors.type":"pressure", "sensors.value": {$gt: 2500}})
// Встроенные (embedded) документы: вложенные поля, запросы и обновления
db.wells.insertOne({
name: "Well-1002",
location: { field: "Permian", coords: { lat: 31.77, lon: -102.39 } },
equipment: {
compressor: { model: "CMP-900", status: "online" },
valve: { type: "pressure_relief", lastService: ISODate("2025-10-01") }
}
})
// Поиск по вложенным полям (dot-notation)
db.wells.find({ "location.field": "Permian", "equipment.compressor.status": "online" }, { _id:0, name:1 })
// Проекция поддокумента
db.wells.find({ name: "Well-1002" }, { _id:0, equipment:1 })
// Обновление вложенного поля
db.wells.updateOne(
{ name: "Well-1002" },
{ $set: { "equipment.compressor.status": "maintenance" } }
)
// Добавление нового вложенного поля, если его не было
db.wells.updateOne(
{ name: "Well-1002" },
{ $set: { "equipment.sensorHub": { firmware: "1.2.3", ports: 8 } } }
)
// Удаление вложенного поля
db.wells.updateOne(
{ name: "Well-1002" },
{ $unset: { "equipment.valve.lastService": "" } }
)
```