Соответствие MySQL и MongoDB запросов
Эта шпоргалка создана для того чтобы упростить переход с SQL баз данных на MongoDB. В ней остались не затронутыми многие особенности и возможности MongoDB, неимеющие аналогов в SQL, такие как MapReduce, например. Или те о которых я незнаю. Это просто список соответствий MySQL запросов и запросов MongoDb.
- Исходные данные
- Простые запросы на выборку
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.
- Запросы на выборку с регулярными выражениями
- Запросы на выборку с группировками
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 = 12 GROUP 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 BY category_id, author_idSELECT 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
- Запросы на выборку с объединением таблиц
- Информация о запросе
- Создание, изменение и удаление документов
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 = 5UPDATE articles SET voters = voters - 1 WHERE id = 5UPDATE articles SET voters = voters + 1 WHERE id IN (1, 2, 3)UPDATE articles SET voters = voters - 1 WHERE category_id = 12 AND author_id = 23DELETE FROM articlesDELETE FROM articles WHERE id = 5DELETE FROM articles WHERE id IN (1, 2, 3)DELETE FROM articles WHERE popular = 0
Исходные данные
Схема SQL базы данных
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
{_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
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
Ruby драйвер
MongoMapper
Article.all
SELECT * FROM articles WHERE id = 12
SELECT * FROM articles WHERE id IN (1, 2, 3, 4, 5)
JavaScript
db.articles.find({_id: {"$in": [1, 2, 3, 4, 5]}});
Ruby драйвер
db["articles"].find({:_id => {"$in" => [1, 2, 3, 4, 5]}})
MongoMapper
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({_id: {"$nin": [1, 2, 3, 4, 5]}});
Ruby драйвер
db["articles"].find({:_id => {"$nin" => [1, 2, 3, 4, 5]}})
MongoMapper
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, "$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, "$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, "$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
Ruby драйвер
MongoMapper
Article.first(:conditions => {:voters => {"$gt" => 5}})
SELECT title, body FROM articles
JavaScript
Ruby драйвер
MongoMapper
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(100);
db.articles.find().skip(10).limit(10);
Ruby драйвер
db["articles"].find().limit(100).to_a
db["articles"].find().skip(10).limit(10).to_a
MongoMapper
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, title: 1});
Ruby драйвер
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 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({voters: {"$gt": 5}}).count();
Ruby драйвер
db["articles"].find({:voters => {"$gt" => 5}}).count()
MongoMapper
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", {voters: {"$gt": 0}})
Ruby драйвер
db["articles"].distinct(:category_id, {:voters => {"$gt" => 0}})
MongoMapper
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: {"$ne": /^Mongo .*/i}});
Ruby драйвер
db["articles"].find({:title => {"$ne" => /^Mongo .*/}})
MongoMapper
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: {"$ne": /^Mongo(DB|Mapper)/i}});
Ruby драйвер
db["articles"].find({:title => {"$ne" => /^Mongo(DB|Mapper)/}})
MongoMapper
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
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 драйвер
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
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
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 драйвер
{: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
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
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 драйвер
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
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
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 драйвер
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
Запросы на выборку с объединением таблиц
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
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 драйвер
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, {:popular => 1}) # смотри в примере с ruby драйвером
SELECT a.*, c.* FROM articles a INNER JOIN categories c ON a.category_id = c.id WHERE a.shared = 1
Этот случай сложнее предыдущего, но тоже решаем. Немного изменим функцию.
JavaScript
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 драйвер
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, {:shared => 1}) # смотри в примере с ruby драйвером
Информация о запросе
EXPLAIN SELECT * FROM articles WHERE popular = 1
JavaScript
Ruby драйвер
MongoMapper
Создание, изменение и удаление документов
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
body: "Статья",
rating: 0,
voters: 0,
category_id: 10,
author_id: 12,
created_at: new Date(2010, 1, 25, 18, 31, 4)
});
Ruby драйвер
: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
: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: {"$in": [ObjectId("4b5616a2b34fb4071f000001"),
ObjectId("4b5616a2b34fb4071f000002"),
ObjectId("4b5616a2b34fb4071f000003")]}},
{title: "Заголовок"}, false, true);
Ruby драйвер
db["articles"].update({_id: {"$in" => [Mongo::ObjectId.new("4b5616a2b34fb4071f000001"),
Mongo::ObjectId.new("4b5616a2b34fb4071f000001"),
Mongo::ObjectId.new("4b5616a2b34fb4071f000001")]}},
{:title => "Заголовок"}, :multi => true)
MongoMapper
Article.update(["4b5616a2b34fb4071f000001",
"4b5616a2b34fb4071f000002",
"4b5616a2b34fb4071f000003"],
{:title => "Заголовок"})
UPDATE articles SET popular = 1 WHERE voters > 10
JavaScript
Ruby драйвер
MongoMapper
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: {"$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: {"$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.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
Ruby драйвер
MongoMapper
DELETE FROM articles WHERE id = 5
JavaScript
Ruby драйвер
MongoMapper
DELETE FROM articles WHERE id IN (1, 2, 3)
DELETE FROM articles WHERE popular = 0
JavaScript
ObjectId("4b5616a2b34fb4071f000002"),
ObjectId("4b5616a2b34fb4071f000003")});
db.articles.remove({popular: 0});
Ruby драйвер
Mongo::ObjectId.new("4b5616a2b34fb4071f000002"),
Mongo::ObjectId.new("4b5616a2b34fb4071f000003")]}})
MongoMapper
Mongo::ObjectId.new("4b5616a2b34fb4071f000002"),
Mongo::ObjectId.new("4b5616a2b34fb4071f000003"))
Article.delete_all({:popular => 0})

(15 голосов, средний: 4.73 из 5)
Хорошая статья о MongoDB. Спасибо.
maenwen
20 марта 10 at 23:30
Классная подборка! А есть что-то вроде этого, но для С++?
avp
15 июня 10 at 21:45
Я, к сожалению, не так близок c C++.
undr
16 июня 10 at 9:18
А можно вопрос,как в MongoDB через командную строку создать коллекцию, но не вставлять туда данные? То есть простой аналог SQLного Create Database??
unknown
30 Авг 10 at 23:07
Статья полезная спасибо правдоть такой вопрос не смог запрос с like реализовать на питоне не напишите примерчик, а то все бошку сломал уже ))
madgreg
15 Сен 10 at 16:58
Я, к сожалению, не знаю питон, но мне кажется принципиальных отличий от руби быть не должно.
В крайнем случае можно создать функцию на js и в ней написать запрос.
db.articles.find({title: /.* Mongo.*/i});
А потом вызывать ее из питона.
undr
16 Сен 10 at 15:22
Для примера в рсубд есть таблица пунктов меню, у каждого пункта есть parent_id, что бы формировать иерархию. Если применять дополнительные поля для оптимизации запросов по иерархии, то можно организовать выборку пунктов меню с условием, что у выбираемых пунктов есть в подчинении какой-то конкретный пункт, причем не важно на какой глубине… Или наоборот, выбирать пункты, у которых есть родитель определенный. (По аналогии проверки, наследует ли класс некий другой класс).
Вот. В mongodb я так понимаю иерархическая модуль данных, можно ли по ней делать поиск с условиями на родителей или детей?
vova
13 Ноя 10 at 13:45
Непосредственно лазить по дереву документов, насколько я знаю, нельзя, но можно сделать похожую структуру как в SQLных базах. Хранить в массиве путь или всех детей и искать используя их
undr
24 Ноя 10 at 11:36