← К оглавлению занятия

💻 Примеры

📁 Блок: Revision / MongoDB и Colab ⏱️ Время изучения: ~90 мин 🎯 Сложность: Повторение

⚡ Кратко: суть занятия

Revision 2 повторяет подключение MongoDB из Python и запросы к ich.Spotify_Youtube.

В Python используется pymongo: MongoClient, выбор базы, выбор коллекции, find, list(...), DataFrame и close.

Источник показывает read-only подключение к ich и пример подключения с правами редактирования к ich_edit.

Повторение MongoDB включает равенство по Artist, диапазоны Danceability/Tempo, логические $and, regex и $in/$all.

Aggregation-повторение перечисляет $match, $group, $project, $sort, $limit, $unwind, $lookup, $out, $geoNear, $bucket, $merge, $sample и $facet.

Фасетирование возвращает несколько независимых результатов, например AlbumTypes и avgEnergy.

Домашка 20 объединяет MySQL sakila и MongoDB restaurants.

Топ-3 ошибки: публиковать реальные пароли, путать regex /hot/ и /hot/i, забыть закрыть MongoClient.

Выполнимые примеры

Подключение и DataFrame

Пароли в примере заменены placeholders: реальные секреты не публикуйте.

from pymongo import MongoClient
import pandas as pd

client = MongoClient("mongodb://USER:PASSWORD@HOST:27017/?authSource=ich")
db = client["ich"]
collection = db["Spotify_Youtube"]
data = list(collection.find())
df = pd.DataFrame(data)
print(df.head())
client.close()

Artist Gorillaz

Базовое равенство по Artist.

db.Spotify_Youtube.find({ Artist: "Gorillaz" });

Диапазоны

Danceability и Tempo выбираются через $gt.

db.Spotify_Youtube.find({ Danceability: { $gt: 0.8 } });
db.Spotify_Youtube.find({ Tempo: { $gt: 130 } });

Energy и Valence

$and явно соединяет два условия.

db.Spotify_Youtube.find({
  $and: [
    { Energy: { $gt: 0.7 } },
    { Valence: { $gt: 0.7 } }
  ]
});

Regex hot и Good

$all требует, чтобы оба regex-паттерна были применимы к полю Description.

db.Spotify_Youtube.find({ Description: { $all: [/hot/i, /Good/i] } });

Facet AlbumTypes и avgEnergy

Два результата возвращаются в одном документе.

db.Spotify_Youtube.aggregate([
  { $facet: {
      AlbumTypes: [
        { $sortByCount: "$Album_type" },
        { $project: { _id: 0, type: "$_id", count: 1 } }
      ],
      avgEnergy: [
        { $group: { _id: "$Album_type", avgEnergy: { $avg: "$Energy" } } },
        { $project: { _id: 0, type: "$_id", avgEnergy: 1 } }
      ]
  } }
]);