Работа с MongoDB: Подробнее о языке запросов ч.1
декабря 28, 2011 | Published in MongoDB, Базы данных | 1 Comment
В этой статье мы подробнее рассмотрим ранее описанные метод .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 еще более подробно.
мая 28, 2013 at 21:01 (#)
[...] Работа с MongoDB: Подробнее о языке [...]