# 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": "" } } ) ```