Undr

На память

Соответствие MySQL и MongoDB запросов

1 Star2 Stars3 Stars4 Stars5 Stars (15 голосов, средний: 4.73 из 5)
Loading ... Loading ...

with 8 comments

Эта шпоргалка создана для того чтобы упростить переход с SQL баз данных на MongoDB. В ней остались не затронутыми многие особенности и возможности MongoDB, неимеющие аналогов в SQL, такие как MapReduce, например. Или те о которых я незнаю. Это просто список соответствий MySQL запросов и запросов MongoDb.

  1. Исходные данные
  2. Простые запросы на выборку
  3. Запросы на выборку с регулярными выражениями
  4. Запросы на выборку с группировками
  5. Запросы на выборку с объединением таблиц
  6. Информация о запросе
  7. Создание, изменение и удаление документов

Исходные данные

Схема 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

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

SELECT * FROM articles

JavaScript

  db.articles.find();

Ruby драйвер

  db["articles"].find

MongoMapper

  Article.find(:all)
  Article.all

SELECT * FROM articles WHERE id = 12

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

JavaScript

  db.articles.find({_id: 12});
  db.articles.find({_id: {"$in": [1, 2, 3, 4, 5]}});

Ruby драйвер

  db["articles"].find({:_id => 12})
  db["articles"].find({:_id => {"$in" => [1, 2, 3, 4, 5]}})

MongoMapper

  Article.find(12)
  Article.find([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)

JavaScript

  db.articles.find({author_id: {"$ne": 12}});
  db.articles.find({_id: {"$nin": [1, 2, 3, 4, 5]}});

Ruby драйвер

  db["articles"].find({:author_id => {"$ne" => 12}}})
  db["articles"].find({:_id => {"$nin" => [1, 2, 3, 4, 5]}})

MongoMapper

  Article.find(:all, :conditions => {:author_id => {"$ne" => 12}})
  Article.all(:conditions => {:author_id => {"$ne" => 12}})
 
  Article.find(:all, :conditions => {:_id => {"$nin" => [1, 2, 3, 4, 5]}})
  Article.all(:conditions => {:_id => {"$nin" => [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'

JavaScript

  db.articles.find({voters: {"$gt": 5}});
  db.articles.find({voters: {"$gt": 5, "$lt": 20}});
  db.articles.find({voters: {"$where": "this.voters < 5 || this.voters > 20"}});
  db.articles.find({created_at: {"$lte": new Date(2010, 1, 20)}});
  db.articles.find({created_at: {"$gte": new Date(2009, 1, 25), "$lt": new Date(2009, 1, 25, 23, 59, 59)}});

Ruby драйвер

  db["articles"].find({:voters => {"$gt" => 5}})
  db["articles"].find({:voters => {"$gt" => 5, "$lt" => 20}})
  db["articles"].find({:voters => {"$where" => "this.voters < 5 || this.voters > 20"}})
  db["articles"].find({:created_at => {"$lte" => Time.gt(2010, 1, 20)}})
  db["articles"].find({:created_at => {"$gte" => Time.gt(2009, 1, 25), "$lt" => Time.gt(2009, 1, 25, 23, 59, 59)}})

MongoMapper

  Article.find(:all, :conditions => {:voters => {"$gt" => 5}})
  Article.find(:all, :conditions => {:voters => {"$gt" => 5, "$lt" => 20}})
  Article.find(:all, :conditions => {:voters => {"$where" => "this.voters < 5 || this.voters > 20"}})
  Article.find(:all, :conditions => {:created_at => {"$lte" => Time.gt(2010, 1, 20)}})
  Article.find(:all, :conditions => {:created_at => {"$gte" => Time.gt(2009, 1, 25), "$lt" => Time.gt(2009, 1, 25, 23, 59, 59)}})
 
  Article.all(:conditions => {:voters => {"$gt" => 5}})
  Article.all(:conditions => {:voters => {"$gt" => 5, "$lt" => 20}})
  Article.all(:conditions => {:voters => {"$where" => "this.voters < 5 || this.voters > 20"}})
  Article.all(:conditions => {:created_at => {"$lte" => Time.gt(2010, 1, 20)}})
  Article.all(:conditions => {:created_at => {"$gte" => Time.gt(2009, 1, 25), "$lt" => Time.gt(2009, 1, 25, 23, 59, 59)}})

SELECT * FROM articles WHERE voters > 5 LIMIT 1

JavaScript

  db.articles.find({voters: {"$gt": 5}}).limit(1);

Ruby драйвер

  db["articles"].find({:voters => {"$gt" => 5}}).limit(1)

MongoMapper

  Article.find(:first, :conditions => {:voters => {"$gt" => 5}})
  Article.first(:conditions => {:voters => {"$gt" => 5}})

SELECT title, body FROM articles

JavaScript

  db.articles.find({}, {title: true, body: true});

Ruby драйвер

  db["articles"].find({}, [:title, :body])

MongoMapper

  Article.find(:all, :select => [:title, :body])
  Article.all(:select => [:title, :body])

SELECT * FROM articles LIMIT 1

SELECT * FROM articles LIMIT 100

SELECT * FROM articles LIMIT 10, 10

JavaScript

  db.articles.find().limit(1);
  db.articles.find().limit(100);
  db.articles.find().skip(10).limit(10);

Ruby драйвер

  db["articles"].find().limit(1).to_a
  db["articles"].find().limit(100).to_a
  db["articles"].find().skip(10).limit(10).to_a

MongoMapper

  Article.find(:first)
  Article.first()
 
  Article.find(:all, :limit => 10)
  Article.all(:limit => 10)
 
  Article.find(:all, :skip => 10, :limit => 10)
  Article.all(:skip => 10, :limit => 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

JavaScript

  db.articles.find().sort({created_at: -1});
  db.articles.find().sort({created_at: 1});
  db.articles.find().sort({created_at: -1, title: 1});

Ruby драйвер

  db["articles"].find().sort(:created_at, -1).to_a
  db["articles"].find().sort(:created_at,  1).to_a
  db["articles"].find().sort([[:created_at, -1], [:title, 1]]).to_a

MongoMapper

  Article.find(:all, :order => 'created_at desc')
  Article.find(:all, :order => 'created_at asc')
  Article.find(:all, :order => 'created_at desc, title asc')

SELECT COUNT(*) AS count FROM articles

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

JavaScript

  db.articles.find().count();
  db.articles.find({voters: {"$gt": 5}}).count();

Ruby драйвер

  db["articles"].find().count()
  db["articles"].find({:voters => {"$gt" => 5}}).count()

MongoMapper

  Article.count()
  Article.count(:conditions => {:voters => {"$gt" => 5}})

SELECT DISTINCT category_id FROM articles

SELECT DISTINCT category_id FROM articles WHERE voters > 0

JavaScript

  db.articles.distinct("category_id")
  db.articles.distinct("category_id", {voters: {"$gt": 0}})

Ruby драйвер

  db["articles"].distinct(:category_id)
  db["articles"].distinct(:category_id, {:voters => {"$gt" => 0}})

MongoMapper

  Article.collection.distinct(:category_id)  
  Article.collection.distinct(:category_id, {:voters => {"$gt" => 0}})

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

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

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

JavaScript

  db.articles.find({title: /.* Mongo.*/i});
  db.articles.find({title: {"$ne": /^Mongo .*/i}});

Ruby драйвер

  db["articles"].find({:title => /.* Mongo.*/})
  db["articles"].find({:title => {"$ne" => /^Mongo .*/}})

MongoMapper

  Article.find(:all, :conditions => {:title => /.* Mongo.*/})
  Article.find(:all, :conditions => {:title => {"$ne" => /^Mongo .*/}})

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

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

JavaScript

  db.articles.find({title: /^Mongo(DB|Mapper)/i});
  db.articles.find({title: {"$ne": /^Mongo(DB|Mapper)/i}});

Ruby драйвер

  db["articles"].find({:title => /^Mongo(DB|Mapper)/})
  db["articles"].find({:title => {"$ne" => /^Mongo(DB|Mapper)/}})

MongoMapper

  Article.find(:all, :conditions => {:title => /^Mongo(DB|Mapper)/})
  Article.find(:all, :conditions => {:title => {"$ne" => /^Mongo(DB|Mapper)/}})

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

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

JavaScript

  db.articles.group({key: {category_id: true},
                     init: {articles_count: 0, rating_sum: 0},
                     reduce: function(doc, prev){
                       prev.articles_count =+ 1;
                       prev.rating_sum =+ doc.rating;
                     },
                     finalize: function(doc){
                       doc.rating_avg = doc.rating_sum / doc.articles_count;
                     }
                    });

Ruby драйвер

  db["articles"].group([:category_id],
                       nil,
                       {:articles_count => 0, :rating_sum => 0},
                       "function(doc, prev){
                          prev.articles_count =+ 1;
                          prev.rating_sum =+ doc.rating;
                        }"
,
                        true,
                        "function(doc){
                           doc.rating_avg = doc.rating_sum / doc.articles_count;
                         }"
)

MongoMapper

  Article.collection.group([:category_id],
                       nil,
                       {:articles_count => 0, :rating_sum => 0},
                       "function(doc, prev){
                          prev.articles_count =+ 1;
                          prev.rating_sum =+ doc.rating;
                        }"
,
                        true,
                        "function(doc){
                           doc.rating_avg = doc.rating_sum / doc.articles_count;
                         }"
)

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

JavaScript

  db.articles.group({key: {category_id: true},
                     cond: {author_id: 12}
                     init: {articles_count: 0, rating_sum: 0},
                     reduce: function(doc, prev){
                       prev.articles_count =+ 1;
                       prev.rating_sum =+ doc.rating;
                     },
                     finalize: function(doc){
                       doc.rating_avg = doc.rating_sum / doc.articles_count;
                     }
                    });

Ruby драйвер

  db["articles"].group([:category_id],
                       {:author_id => 12},
                       {:articles_count => 0, :rating_sum => 0},
                       "function(doc, prev){
                          prev.articles_count =+ 1;
                          prev.rating_sum =+ doc.rating;
                        }"
,
                        true,
                        "function(doc){
                           doc.rating_avg = doc.rating_sum / doc.articles_count;
                         }"
)

MongoMapper

  Article.collection.group(...) # смотри пример для ruby драйвера

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

JavaScript

  db.articles.group({key: {category_id: true, author_id: true},
                     init: {articles_count: 0, rating_sum: 0},
                     reduce: function(doc, prev){
                       prev.articles_count =+ 1;
                       prev.rating_sum =+ doc.rating;
                     },
                     finalize: function(doc){
                       doc.rating_avg = doc.rating_sum / doc.articles_count;
                     }
                    });

Ruby драйвер

  db["articles"].group([:category_id, :author_id],
                       nil,
                       {:articles_count => 0, :rating_sum => 0},
                       "function(doc, prev){
                          prev.articles_count =+ 1;
                          prev.rating_sum =+ doc.rating;
                        }"
,
                        true,
                        "function(doc){
                           doc.rating_avg = doc.rating_sum / doc.articles_count;
                         }"
)

MongoMapper

  Article.collection.group(...) # смотри пример для ruby драйвера

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

JavaScript

  db.articles.group({$keyf: function(doc) {
                       var length = doc.body.split(' ').length;
                       if(lenght < 100) {
                         return {size: "small"};
                       } else if(lenght > 100 && lenght < 500) {
                         return {size: "medium"};
                       } else {
                         return {size: "big"};
                       }
                     },
                     init: {articles_count: 0},
                     reduce: function(doc, prev){
                       prev.articles_count =+ 1;
                     }
                    });

Ruby драйвер

  db["articles"].group("function(doc) {
                         var length = doc.body.split(' ').length;
                         if(lenght < 100) {
                           return {size: "
small"};
                         } else if(lenght > 100 && lenght < 500) {
                           return {size: "
medium"};
                         } else {
                           return {size: "
big"};
                         }
                       }"
,
                       nil,
                       {:articles_count => 0},
                       "function(doc, prev){
                         prev.articles_count =+ 1;
                       }"
,
                      true)

MongoMapper

  Article.collection.group(...) # смотри пример для ruby драйвера

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

MongoDb не поддерживает запросы объединяющие несколько коллекций, но этого можно добиться используя код JavaScript исполняемый на сервере методом eval(). Насколько упадет производительность затрудняюсь ответить, потому что пока не тестировал.

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

Этот способ похож на способ которым ActiveRecord получает данные от связанных таблиц, если в условии WHERE, или сортировке не используются поля из связанных таблиц.

JavaScript

  find_function = function(cond){
                     var categoriesHash = {};
                     db.categories.find({_id: {"$in": db.articles.distinct("category_id", cond)}})
                       .forEach(function(c){categoriesHash[c._id.toString()] = c;});
                     var result = [];
                     db.articles.find(cond).forEach(function(a) {
                       a.category = categoriesHash[a.category_id.toString()];
                       result.push(a);
                     });
                     return result;
                   }
  db.articles.eval(find_function);
  db.articles.eval(find_function, {popular: 1});

Ruby драйвер

  find_function = <<EOS
  function joinCollection(cond = {}) {
    var categoriesHash = {};
    db.categories.find({_id: {"$in": db.articles.distinct("category_id", cond)}})
      .forEach(function(c) {categoriesHash[c._id.toString()] = c;});
    var result = [];
    db.articles.find(cond).forEach(function(a) {
                                      a.category = categoriesHash[a.category_id.toString()];
                                      result.push(a);
                                    });
    return result;
  }
  EOS
  db["articles"].eval(find_function)
  db["articles"].eval(find_function, {:popular => 1})

MongoMapper

  Article.collection.eval(find_function)                  # значение переменной find_function
  Article.collection.eval(find_function, {:popular => 1}) # смотри в примере с ruby драйвером

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

Этот случай сложнее предыдущего, но тоже решаем. Немного изменим функцию.

JavaScript

  find_function = function(cond){
     var categoriesHash = {};
     var categoryIds = [];
     db.categories.find(cond)
       .forEach(function(c){
         categoriesHash[c._id.toString()] = c;
         categoryIds.push(c._id);
       });
     var result = [];
     db.articles.find({category_id: {"$in": categoryIds}}).forEach(function(a) {
       a.category = categoriesHash[a.category_id.toString()];
       result.push(a);
     });
     return result;
   }
  db.articles.eval(find_function);
  db.articles.eval(find_function, {shared: 1});

Ruby драйвер

  find_function = <<EOS
  function joinCollection(cond = {}) {
    var categoriesHash = {};
    db.categories.find({_id: {"$in": db.articles.distinct("category_id", cond)}})
      .forEach(function(c) {categoriesHash[c._id.toString()] = c;});
    var result = [];
    db.articles.find(cond).forEach(function(a) {
                                      a.category = categoriesHash[a.category_id.toString()];
                                      result.push(a);
                                    });
    return result;
  }
  EOS
  db["articles"].eval(find_function)
  db["articles"].eval(find_function, {:shared => 1})

MongoMapper

  Article.collection.eval(find_function)                  # значение переменной find_function
  Article.collection.eval(find_function, {:shared => 1}) # смотри в примере с ruby драйвером

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

EXPLAIN SELECT * FROM articles WHERE popular = 1

JavaScript

  db.articles.find({popular: 1}).explain();

Ruby драйвер

  db["articles"].find({:popular => 1}).explain

MongoMapper

  Article.collection.find({:popular => 1}).explain

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

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

JavaScript

  db.articles.save({title: "Заголовок",
                    body: "Статья",
                    rating: 0,
                    voters: 0,
                    category_id: 10,
                    author_id: 12,
                    created_at: new Date(2010, 1, 25, 18, 31, 4)
                    });

Ruby драйвер

  db["articles"].save({:title => "Заголовок",
                       :body => "Статья",
                       :rating => 0,
                       :voters => 0,
                       :category_id => Mongo::ObjectId("4b5616a2b34fb4071f000018"),
                       :author_id => Mongo::ObjectId("4b5616a2b34fb4071f000023"),
                       :created_at => Time.gt(2010, 1, 25, 18, 31, 4)
                    })

MongoMapper

  Article.create({:title => "Заголовок",
                  :body => "Статья",
                  :rating => 0,
                  :voters => 0,
                  :category_id => Mongo::ObjectId("4b5616a2b34fb4071f000018"),
                  :author_id => Mongo::ObjectId("4b5616a2b34fb4071f000023"),
                  :created_at => Time.gt(2010, 1, 25, 18, 31, 4)
                })

Этот метод небезопасен, он не проверяет наличие свойства у документа и поэтому можно сохранить в базе какие угодно свойства.

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

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

JavaScript

  db.articles.update({_id: ObjectId("4b5616a2b34fb4071f000005")}, {title: "Заголовок"});
  db.articles.update({_id: {"$in": [ObjectId("4b5616a2b34fb4071f000001"),
                                    ObjectId("4b5616a2b34fb4071f000002"),
                                    ObjectId("4b5616a2b34fb4071f000003")]}},
                     {title: "Заголовок"}, false, true);

Ruby драйвер

  db["articles"].update({_id: Mongo::ObjectId.new("4b5616a2b34fb4071f000005")}, {:title => "Заголовок"})
  db["articles"].update({_id: {"$in" => [Mongo::ObjectId.new("4b5616a2b34fb4071f000001"),
                                         Mongo::ObjectId.new("4b5616a2b34fb4071f000001"),
                                         Mongo::ObjectId.new("4b5616a2b34fb4071f000001")]}},
                        {:title => "Заголовок"}, :multi => true)

MongoMapper

  Article.update("4b5616a2b34fb4071f000005", {:title => "Заголовок"})
  Article.update(["4b5616a2b34fb4071f000001",
                  "4b5616a2b34fb4071f000002",
                  "4b5616a2b34fb4071f000003"],
                 {:title => "Заголовок"})

UPDATE articles SET popular = 1 WHERE voters > 10

JavaScript

  db.articles.update({voters: {"$gt": 10}}, {popular: true}, false, true);

Ruby драйвер

  db["articles"].update({:voters => {"$gt" => 10}}, {popular: true}, :multi => true)

MongoMapper

  Article.collection.update({:voters => {"$gt" => 10}}, {popular: true}, :multi => true)

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 AND author_id = 23

JavaScript

  db.articles.update({_id: ObjectId("4b5616a2b34fb4071f000005")}, {"$inc": {voters: 1}});
  db.articles.update({_id: ObjectId("4b5616a2b34fb4071f000005")}, {"$inc": {voters: -1}});
  db.articles.update({_id: {"$in": [ObjectId("4b5616a2b34fb4071f000001"),
                                    ObjectId("4b5616a2b34fb4071f000002"),
                                    ObjectId("4b5616a2b34fb4071f000003")]}},
                     {"$inc": {voters: 1}}, false, true);
  db.articles.update({category_id: ObjectId("4b5616a2b34fb4071f000015"), author_id: ObjectId("4b5616a2b34fb4071f000023")},
                     {"$inc": {voters: -1}}, false, true);

Ruby драйвер

  db["articles"].update({:_id => Mongo::ObjectId.new("4b5616a2b34fb4071f000005")}, {"$inc" => {:voters => 1}})
  db["articles"].update({:_id => Mongo::ObjectId.new("4b5616a2b34fb4071f000005")}, {"$inc" => {:voters => -1}})
  db["articles"].update({_id: {"$in" => [Mongo::ObjectId.new("4b5616a2b34fb4071f000001"),
                                         Mongo::ObjectId.new("4b5616a2b34fb4071f000002"),
                                         Mongo::ObjectId.new("4b5616a2b34fb4071f000003")]}},
                        {"$inc" => {:voters => 1}}, :multi => true)
  db["articles"].update({:category_id => Mongo::ObjectId.new("4b5616a2b34fb4071f000015"),
                         :author_id => Mongo::ObjectId.new("4b5616a2b34fb4071f000002")},
                        {"$inc" => {:voters => -1}}, :multi => true)

MongoMapper

  Article.increment(Mongo::ObjectId.new("4b5616a2b34fb4071f000005"), {:voters => 1})
  Article.decrement(Mongo::ObjectId.new("4b5616a2b34fb4071f000005"), {:voters => 1})
  Article.increment({_id: {"$in" => [Mongo::ObjectId.new("4b5616a2b34fb4071f000001"),
                                     Mongo::ObjectId.new("4b5616a2b34fb4071f000002"),
                                     Mongo::ObjectId.new("4b5616a2b34fb4071f000003")]}},
                    {:voters => 1})
  Article.decrement({:category_id => Mongo::ObjectId.new("4b5616a2b34fb4071f000015"),
                     :author_id => Mongo::ObjectId.new("4b5616a2b34fb4071f000023")},
                    {:voters => 1})

DELETE FROM articles

JavaScript

  db.articles.remove({});

Ruby драйвер

  db["articles"].remove

MongoMapper

  Article.delete_all

DELETE FROM articles WHERE id = 5

JavaScript

  db.articles.remove({_id: ObjectId("4b5616a2b34fb4071f000005")});

Ruby драйвер

  db["articles"].remove({:_id => Mongo::ObjectId.new("4b5616a2b34fb4071f000005")})

MongoMapper

  Article.delete(Mongo::ObjectId.new("4b5616a2b34fb4071f000005"))

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

DELETE FROM articles WHERE popular = 0

JavaScript

  db.articles.remove({_id: {"$in": [ObjectId("4b5616a2b34fb4071f000001"),
                                    ObjectId("4b5616a2b34fb4071f000002"),
                                    ObjectId("4b5616a2b34fb4071f000003")});
  db.articles.remove({popular: 0});

Ruby драйвер

  db["articles"].remove({:_id => {"$in" => [Mongo::ObjectId.new("4b5616a2b34fb4071f000001"),
                                            Mongo::ObjectId.new("4b5616a2b34fb4071f000002"),
                                            Mongo::ObjectId.new("4b5616a2b34fb4071f000003")]}})

MongoMapper

  Article.delete([Mongo::ObjectId.new("4b5616a2b34fb4071f000001"),
                  Mongo::ObjectId.new("4b5616a2b34fb4071f000002"),
                  Mongo::ObjectId.new("4b5616a2b34fb4071f000003"))
  Article.delete_all({:popular => 0})

Написал undr ()

27 января 2010 в 11:20

8 Responses to 'Соответствие MySQL и MongoDB запросов'

Подписаться на комментарии or TrackBack to 'Соответствие MySQL и MongoDB запросов'.

  1. Хорошая статья о MongoDB. Спасибо.

    maenwen

    20 марта 10 at 23:30

  2. Классная подборка! А есть что-то вроде этого, но для С++?

    avp

    15 июня 10 at 21:45

  3. Я, к сожалению, не так близок c C++.

    undr

    16 июня 10 at 9:18

  4. А можно вопрос,как в MongoDB через командную строку создать коллекцию, но не вставлять туда данные? То есть простой аналог SQLного Create Database??

    unknown

    30 Авг 10 at 23:07

  5. Статья полезная спасибо правдоть такой вопрос не смог запрос с like реализовать на питоне не напишите примерчик, а то все бошку сломал уже ))

    madgreg

    15 Сен 10 at 16:58

  6. Я, к сожалению, не знаю питон, но мне кажется принципиальных отличий от руби быть не должно.

    В крайнем случае можно создать функцию на js и в ней написать запрос.

    db.articles.find({title: /.* Mongo.*/i});

    А потом вызывать ее из питона.

    undr

    16 Сен 10 at 15:22

  7. Для примера в рсубд есть таблица пунктов меню, у каждого пункта есть parent_id, что бы формировать иерархию. Если применять дополнительные поля для оптимизации запросов по иерархии, то можно организовать выборку пунктов меню с условием, что у выбираемых пунктов есть в подчинении какой-то конкретный пункт, причем не важно на какой глубине… Или наоборот, выбирать пункты, у которых есть родитель определенный. (По аналогии проверки, наследует ли класс некий другой класс).

    Вот. В mongodb я так понимаю иерархическая модуль данных, можно ли по ней делать поиск с условиями на родителей или детей?

    vova

    13 Ноя 10 at 13:45

  8. Непосредственно лазить по дереву документов, насколько я знаю, нельзя, но можно сделать похожую структуру как в SQLных базах. Хранить в массиве путь или всех детей и искать используя их

    undr

    24 Ноя 10 at 11:36

Оставьте комментарий