Работа с MongoDB: Подробнее о языке запросов ч.1

декабря 28, 2011  |  Published in MongoDB, Базы данных  |  1 Comment

mongoDBВ этой статье мы подробнее рассмотрим ранее описанные метод .find() и объекта запроса.

Методы .find() и .findOne() используются соответственно для поиска всех документов и поиска первого документа, что соответствуют запросу.

 


db.posts.find()
/*
{ "_id" : ObjectId("4ef64c526e06ee4cec3dab4e"), "title" : "Title for post # 1", "content" : "Content for post # 1" }
{ "_id" : ObjectId("4ef64c526e06ee4cec3dab4f"), "title" : "Title for post # 2", "content" : "Content for post # 2" }
...
{ "_id" : ObjectId("4ef714746dca6d809b6f4cdd"), "title" : "Title #9", "content" : "Content #9" }
{ "_id" : ObjectId("4ef714746dca6d809b6f4cde"), "title" : "Title #10", "content" : "Content #10" }
*/

db.posts.find().count() //20

db.posts.find({ title : "Title #2" }).count() //1

db.posts.find({ title : "Title #2" })
/*
{ "_id" : ObjectId("4ef714746dca6d809b6f4cd6"), "title" : "Title #2", "content" : "Content #2" }
*/

db.posts.find({ title : "Title #2", content : "Content #2" })
/*
{ "_id" : ObjectId("4ef714746dca6d809b6f4cd6"), "title" : "Title #2", "content" : "Content #2" }
*/

db.posts.find().sort({ title : 1 })
/*
{ "_id" : ObjectId("4ef714746dca6d809b6f4cd4"), "title" : "Title #0", "content" : "Content #0" }
{ "_id" : ObjectId("4ef714746dca6d809b6f4cd5"), "title" : "Title #1", "content" : "Content #1" }
{ "_id" : ObjectId("4ef714746dca6d809b6f4cde"), "title" : "Title #10", "content" : "Content #10" }
...
{ "_id" : ObjectId("4ef64c526e06ee4cec3dab4e"), "title" : "Title for post # 1", "content" : "Content for post # 1" }
{ "_id" : ObjectId("4ef64c526e06ee4cec3dab57"), "title" : "Title for post # 10", "content" : "Content for post # 10" }
...
{ "_id" : ObjectId("4ef64c526e06ee4cec3dab56"), "title" : "Title for post # 9", "content" : "Content for post # 9" }
*/

db.posts.find().sort({ title : 1 }).limit(3)
/*
{ "_id" : ObjectId("4ef714746dca6d809b6f4cd4"), "title" : "Title #0", "content" : "Content #0" }
{ "_id" : ObjectId("4ef714746dca6d809b6f4cd5"), "title" : "Title #1", "content" : "Content #1" }
{ "_id" : ObjectId("4ef714746dca6d809b6f4cde"), "title" : "Title #10", "content" : "Content #10" }
*/

Метод .find() принимает в качестве аргумента json объект и ищет в коллекции соответствующие запросу документы, в примерах выше, это например документ у которого свойство title хранит строку «Title #2″, а свойство content — строку «Content #2″ ({ title : «Title #2″, content : «Content #2″ }). Методы .sort() и .limit() являются синтаксическим сахаром, что добавляется командной строкой MongoDB и MongoDB драйверами, внутри такие «сахарные» запросы превращаются в следующее:


//из такого:
db.posts.find({title : /1/ }).sort({ content : 1 })

//в такой:
db.posts.find({ $query: { title : /1/ }, $orderby : { content : 1 }})

Самое важное здесь понять и запомнить, что запросы в MongoDB — это также JSON объекты, как собственно и документы (документы хранятся в формате BSON, а представляются в формате JSON).

Еще интересным моментом в примере выше является то, как легко делать выборку из коллекции по соответствию регулярному выражению. Вы просто пишите имя свойства документа и регулярное выражение внутри двух слешей и MongoDB выполняет по нему поиск.

.find() по истине универсальный метод выборки, например, нам неоюходимо сделать выборку всех товаров, у которых цена меньше определенной суммы, для этого нам нужно написать совсем простой запрос:


db.products.find({ prise: { $lt : 30}});
/*
{ "_id" : ObjectId("4efac0450f837edc0e9db40f"), "prise" : 10, "name" : "product", "desc" : "Description ..." }
{ "_id" : ObjectId("4efac0450f837edc0e9db410"), "prise" : 20, "name" : "product", "desc" : "Description ..." }
*/

А если больше, то такой:

db.products.find({ prise: { $gt : 200}});
/*
{ "_id" : ObjectId("4efac0450f837edc0e9db423"), "prise" : 210, "name" : "product", "desc" : "Description ..." }
{ "_id" : ObjectId("4efac0450f837edc0e9db424"), "prise" : 220, "name" : "product", "desc" : "Description ..." }
*/

Использование свойств $gt и $lt объекта запроса аналогичны использованию > и < в SQL запросах. Это может казаться не так удобно, но в перспективе работая с MongoDB используя драйвер под Ruby мы этого совсем не заметим. В качестве замены для операторов >= и <= в в объекте запроса также существуют специальные свойства: $gte и $lte:

db.products.find({ prise: { $gte : 200}});
/*
{ "_id" : ObjectId("4efac0450f837edc0e9db422"), "prise" : 200, "name" : "product", "desc" : "Description ..." }
{ "_id" : ObjectId("4efac0450f837edc0e9db423"), "prise" : 210, "name" : "product", "desc" : "Description ..." }
{ "_id" : ObjectId("4efac0450f837edc0e9db424"), "prise" : 220, "name" : "product", "desc" : "Description ..." }
*/

Запомнить, что каждое свойство запроса означает очень просто (хотя их названия в принципе и не новы):

$gt — greater than… — больше, чем…
$lt — less than… — меньше, чем…
$gte — great than or equal… — больше, чем …, или равно
$lte — less than or equal… — меньше, чем …, или равно

Еще один крайне полезным свойством JSON-объекта запросов является свойство $in, оно позволяет делать выборку только тех документов у которых определенное свойство имеет значение из списка допустимых. Пример:

db.products.find({ prise: { $in : [10, 50, 100]}});
/*
{ "_id" : ObjectId("4efac0450f837edc0e9db40f"), "prise" : 10, "name" : "product", "desc" : "Description ..." }
{ "_id" : ObjectId("4efac0450f837edc0e9db413"), "prise" : 50, "name" : "product", "desc" : "Description ..." }
{ "_id" : ObjectId("4efac0450f837edc0e9db418"), "prise" : 100, "name" : "product", "desc" : "Description ..." }
*/

Антиподом $in является свойство $nin, которае наоборот позволяет выбрать объекты определенное свойство которых не содержит значения из списка. Пример:

db.products.find({ prise: { $nin : [10, 50, 100, 200, 210, 220]}});
/*
{ "_id" : ObjectId("4efac0450f837edc0e9db410"), "prise" : 20, "name" : "product", "desc" : "Description ..." }
{ "_id" : ObjectId("4efac0450f837edc0e9db411"), "prise" : 30, "name" : "product", "desc" : "Description ..." }
{ "_id" : ObjectId("4efac0450f837edc0e9db412"), "prise" : 40, "name" : "product", "desc" : "Description ..." }
{ "_id" : ObjectId("4efac0450f837edc0e9db414"), "prise" : 60, "name" : "product", "desc" : "Description ..." }
//...
{ "_id" : ObjectId("4efac0450f837edc0e9db421"), "prise" : 190, "name" : "product", "desc" : "Description ..." }
*/

В следующей статье мы познакомимся с языком запросов MongoDB еще более подробно.

Tags: , ,

Responses

  1. says:

    мая 28, 2013 at 21:01 (#)

    [...] Работа с MongoDB: Подробнее о языке [...]

Leave a Response

Для подсветки кода используйте BB - коды: [language]...[/language], где language может быть: ruby, javascript, css, html.