Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Общий конспект по Технологии анализа и обработ...docx
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
3.78 Mб
Скачать

8. Соответствие между sql и MongoDb

Приведем список соответствий MySQL запросов и запросов MongoDb.

  1. Простые запросы на выборку

    • SELECT * FROM articles.

    • SELECT * FROM articles WHERE id = 12.

    • SELECT * FROM articles WHERE id IN (1, 2, 3, 4, 5).

    • SELECT * FROM articles WHERE author_id NOT 12.

    • SELECT * FROM articles WHERE id NOT IN (1, 2, 3, 4, 5).

    • SELECT * FROM articles WHERE voters > 5.

    • SELECT * FROM articles WHERE voters > 5 AND voters < 20.

    • SELECT * FROM articles WHERE voters < 5 OR voters > 20.

    • SELECT * FROM articles WHERE created_at <= '2010-01-20 00:00:00'.

    • SELECT * FROM articles WHERE created_at BETWEEN '2009-01-25 00:00:00' AND'2010-01-25 23:59:59'.

    • SELECT * FROM articles WHERE voters > 5 LIMIT 1.

    • SELECT title, body FROM articles.

    • SELECT * FROM articles LIMIT 1.

    • SELECT * FROM articles LIMIT 100.

    • SELECT * FROM articles LIMIT 10, 10.

    • SELECT * FROM articles ORDER BY created_at DESC.

    • SELECT * FROM articles ORDER BY created_at ASC.

    • SELECT * FROM articles ORDER BY created_at DESC, title ASC.

    • SELECT COUNT(*) AS count FROM articles.

    • SELECT COUNT(*) AS count FROM articles WHERE voters > 5.

    • SELECT DISTINCT category_id FROM articles.

    • SELECT DISTINCT category_id FROM articles WHERE voters > 0.

  2. Запросы на выборку с регулярными выражениями

    • SELECT * FROM articles WHERE title LIKE '% Mongo%'.

    • SELECT * FROM articles WHERE title NOT LIKE 'Mongo %'.

    • SELECT * FROM articles WHERE title REGEXP "^Mongo(DB|Mapper)".

    • SELECT * FROM articles WHERE title NOT REGEXP "^Mongo(DB|Mapper)".

  3. Запросы на выборку с группировками

    • SELECT COUNT(id) AS articles_count, SUM(rating) AS rating_sum,AVG(rating) AS rating_avg, category_id FROM articles GROUP BY category_id.

    • SELECT COUNT(id) AS articles_count, SUM(rating) AS rating_sum,AVG(rating) AS rating_avg, category_id FROM articles WHERE author_id = 12GROUP BY category_id.

    • SELECT COUNT(id) AS articles_count, SUM(rating) AS rating_sum,AVG(rating) AS rating_avg, category_id, author_id FROM articles GROUP BYcategory_id, author_id

    • SELECT COUNT(id),  CASE WHEN (LENGTH(body) - LENGTH(REPLACE(body, ' ','')) + 1) < 100 THEN 'small' WHEN ((LENGTH(body) -LENGTH(REPLACE(body, ' ', '')) + 1) > 100 && (LENGTH(body) -LENGTH(REPLACE(body, ' ', '')) + 1) < 500)  THEN 'medium' WHEN(LENGTH(body) - LENGTH(REPLACE(body, ' ', '')) + 1) > 500 THEN'big' END AS size FROM entities GROUP BY size

  4. Запросы на выборку с объединением таблиц

    • SELECT a.*, c.* FROM articles a INNER JOIN categories c ON a.category_id= c.id

    • SELECT a.*, c.* FROM articles a INNER JOIN categories c ON a.category_id= c.id WHERE a.popular = 1

    • SELECT a.*, c.* FROM articles a INNER JOIN categories c ON a.category_id= c.id WHERE c.shared = 1

  5. Информация о запросе

    • EXPLAIN SELECT * FROM articles WHERE popular = 1

  6. Создание, изменение и удаление документов

    • INSERT INTO articles (title, body, rating, voters, category_id,author_id, created_at) VALUES ('Заголовок', 'Статья', 0, 0, 10, 12,'2010-01-25 18:31:04').

    • UPDATE articles SET title = 'Заголовок' WHERE id = 5.

    • UPDATE articles SET title = 'Заголовок' WHERE id IN (1, 2, 3).

    • UPDATE articles SET popular = 1 WHERE voters > 10.

    • UPDATE articles SET voters = voters + 1 WHERE id = 5

    • UPDATE articles SET voters = voters - 1 WHERE id = 5

    • UPDATE articles SET voters = voters + 1 WHERE id IN (1, 2, 3)

    • UPDATE articles SET voters = voters - 1 WHERE category_id = 12 ANDauthor_id = 23

    • DELETE FROM articles

    • DELETE FROM articles WHERE id = 5

    • DELETE FROM articles WHERE id IN (1, 2, 3)

    • DELETE FROM articles WHERE popular = 0

SQL Terms, Functions, and Concepts

MongoDB Aggregation Operators

WHERE

$match

GROUP BY

$group

HAVING

$match

SELECT

$project

ORDER BY

$sort

LIMIT

$limit

SUM()

$sum

COUNT()

$sum

join

No direct corresponding operator; however, the $unwind operator allows for somewhat similar functionality, but with fields embedded within the document.

Схема SQL базы данных

  CREATE TABLE articles (     id int(11) NOT NULL AUTO_INCREMENT,     title varchar(255) NOT NULL,     body text DEFAULT NULL,     voters int(11) DEFAULT 0,     rating int(11) DEFAULT 0,     category_id int(11) DEFAULT NULL,     author_id int(11) DEFAULT NULL,     popular tiniint(1) DEFAULT 0,     created_at datetime DEFAULT NULL   )   CREATE TABLE categories (     id int(11) NOT NULL AUTO_INCREMENT,     title varchar(255) NOT NULL,     shared tiniint(1) DEFAULT 0,     created_at datetime DEFAULT NULL   )   CREATE TABLE authors (     id int(11) NOT NULL AUTO_INCREMENT,     name varchar(255) NOT NULL,     created_at datetime DEFAULT NULL   )

Примеры документов MongoDB

  //коллеция articles   {_id: 4b5616a2b34fb4071f000018,     title: "Заголовок",     body: "Статья",    voters: 12,    rating: 6,    category_id: 4b5616a2b34fb4071f000089,    author_id: 4b5616a2b34fb4071f000123,    popular: true,    created_at: ""}        //Коллекция categories    {_id: 4b5616a2b34fb4071f000089,      title: "Тема",      shared: true,     created_at: ""}          //Коллекция authors     {_id: 4b5616a2b34fb4071f000123,       name: "Undr",       created_at: ""}

Классы моделей с использованием MongoMapper

  class Article     include MongoMapper::Document          key :title, String     key :body, String     key :voters, Integer     key :rating, Integer     key :category_id, ObjectId, :require => true     key :author_id, ObjectId, :require => true     key :popular, Boolean     key :created_at, Time          belongs_to :category     belongs_to :author   end   class Category     include MongoMapper::Document          key :title, String     key :shared, Boolean     key :created_at, Time          has_many :articles   end   class Author     include MongoMapper::Document          key :name, String     key :created_at, Time          has_many :articles   end

Версии библиотек

  • MongoDB – db version v1.2.2, pdfile version 4.5 (Fri Jan 29 19:13:17 git version: 8a4fb8b1c7cb78648c55368d806ba35054f6be54)

  • Ruby 1.8.6 (2008-08-11 patchlevel 287) [universal-darwin9.0]

  • Rails 2.3.5

  • gem mongo 0.18.2

  • gem mongo_mapper 0.6.10

Сходства и различия в написании кода:

SQL Example

MongoDB Example

Description

SELECT COUNT(*) AS count

FROM orders

db.orders.aggregate( [

{ $group: { _id: null,

count: { $sum: 1 } } }

] )

Count all records from orders

SELECT SUM(price) AS total

FROM orders

db.orders.aggregate( [

{ $group: { _id: null,

total: { $sum: "$price" } } }

] )

Sum the price field from orders

SELECT cust_id,

SUM(price) AS total

FROM orders

GROUP BY cust_id

db.orders.aggregate( [

{ $group: { _id: "$cust_id",

total: { $sum: "$price" } } }

] )

For each unique cust_id, sum the price field.

SELECT cust_id,

SUM(price) AS total

FROM orders

GROUP BY cust_id

ORDER BY total

db.orders.aggregate( [

{ $group: { _id: "$cust_id",

total: { $sum: "$price" } } },

{ $sort: { total: 1 } }

] )

For each unique cust_id, sum the price field, results sorted by sum.

SELECT cust_id,

ord_date,

SUM(price) AS total

FROM orders

GROUP BY cust_id, ord_date

db.orders.aggregate( [

{ $group: { _id: { cust_id: "$cust_id",

ord_date: "$ord_date" },

total: { $sum: "$price" } } }

] )

For each unique cust_idord_date grouping, sum the price field.

SELECT cust_id, count(*)

FROM orders

GROUP BY cust_id

HAVING count(*) > 1

db.orders.aggregate( [

{ $group: { _id: "$cust_id",

count: { $sum: 1 } } },

{ $match: { count: { $gt: 1 } } }

] )

For cust_id with multiple records, return thecust_id and the corresponding record count.

SELECT cust_id,

ord_date,

SUM(price) AS total

FROM orders

GROUP BY cust_id, ord_date

HAVING total > 250

db.orders.aggregate( [

{ $group: { _id: { cust_id: "$cust_id",

ord_date: "$ord_date" },

total: { $sum: "$price" } } },

{ $match: { total: { $gt: 250 } } }

] )

For each unique cust_idord_date grouping, sum the price field and return only where the sum is greater than 250.

SELECT cust_id,

SUM(price) as total

FROM orders

WHERE status = 'A'

GROUP BY cust_id

db.orders.aggregate( [

{ $match: { status: 'A' } },

{ $group: { _id: "$cust_id",

total: { $sum: "$price" } } }

] )

For each unique cust_id with status A, sum theprice field.

SELECT cust_id,

SUM(price) as total

FROM orders

WHERE status = 'A'

GROUP BY cust_id

HAVING total > 250

db.orders.aggregate( [

{ $match: { status: 'A' } },

{ $group: { _id: "$cust_id",

total: { $sum: "$price" } } },

{ $match: { total: { $gt: 250 } } }

] )

For each unique cust_id with status A, sum theprice field and return only where the sum is greater than 250.

SELECT cust_id,

SUM(li.qty) as qty

FROM orders o,

order_lineitem li

WHERE li.order_id = o.id

GROUP BY cust_id

db.orders.aggregate( [

{ $unwind: "$items" },

{ $group: { _id: "$cust_id",

qty: { $sum: "$items.qty" } } }

] )

For each unique cust_id, sum the corresponding line item qty fields associated with the orders.

9.Практическое использование( на примере опыта использования MongoDB для подсчета статистики) представлено на http://redhotchilipython.com/posts/2011-06-03-mongodb-indexes-experience.html

Заключение

MongoDB поддерживает хранение документов в JSON-подобном формате, имеет достаточно гибкий язык для формирования запросов, может создавать индексы для различных хранимых атрибутов, эффективно обеспечивает хранение больших бинарных объектов, поддерживает журналирование операций по изменению и добавлению данных в БД, может работать в соответствии с парадигмой Map/Reduce, поддерживает репликацию и построение отказоустойчивых конфигураций. В MongoDB имеются встроенные средства по обеспечению шардинга (распределение набора данных по серверам на основе определенного ключа), комбинируя который репликацией данных можно построить горизонтально масштабируемый кластер хранения, в котором отсутствует единая точка отказа (сбой любого узла не сказывается на работе БД), поддерживается автоматическое восстановление после сбоя и перенос нагрузки с вышедшего из строя узла. Расширение кластера или преобразование одного сервера в кластер производится без остановки работы БД простым добавлением новых машин.