【IT168 专稿】引言
MongoDB是NoSQL数据库新产品中的重要成员,已经获得众多机构的关注。NoSQL数据管理方法的优点一直在软件社区引起激烈讨论,正如MongoDB一样,值得花费一些时间探索解决方法。
在先前的文章中介绍过作为NoSQL数据库新产品中重要成员的MongoDB,它已经获得众多机构的关注,而在不久之前这些机构还认为它只是关系型数据库的替代品。NoSQL数据管理方法的优点一直在软件社区引起激烈讨论,正如MongoDB一样,值得花费一些时间探索其解决方法。这样做,你会从一个全新的角度审视你的数据。
在这篇文章中,我将介绍一个MongoDB引起重新考虑的功能。正如其名,MongoDB解决方案不依赖于传统的SQL查询为基础的方法来检索和操纵数据。但是没有SQL,怎样访问数据呢,更不用说过滤和聚合以及怎样实现SQL的WHERE和GROUPY BY子句。这篇文章将告诉你如何在MongoDB中完成这些工作。
查找和筛选数据
MongoDB的find()方法对于检索集合中的元素是非常有用的。例如,如果你创建了一个名为library的数据库,并添加了几本书,然后就可以用find()方法访问这些元素了。我将使用Mongo shell来演示它。
MongoDB shell version: 1.6.1
connecting to: library
> db.books.save({title: 'Farewell to Arms', author: 'Ernest Hemingway'})
> db.books.save({title: 'The Maltese Falcon', author: 'Dashiell Hammett'})
> db.books.save({title: 'The Sun Also Rises', author: 'Ernest Hemingway'})
> db.books.find()
{ "_id" : ObjectId("4c83b9b84e3f3ef212be6e76"), "title" : "Farewell to Arms", "author" : "Ernest Hemingway" }
{ "_id" : ObjectId("4c83b9eb4e3f3ef212be6e77"), "title" : "The Maltese Falcon", "author" : "Dashiell Hammett" }
{ "_id" : ObjectId("4c83b9f94e3f3ef212be6e78"), "title" : "The Sun Also Rises", "author" : "Ernest Hemingway" }
那么怎样检索由海明威撰写的书籍呢?你需要将所需的关键字和关联值传递给find()方法:
{ "_id" : ObjectId("4c83b9b84e3f3ef212be6e76"), "title" : "Farewell to Arms", "author" : "Ernest Hemingway" }
{ "_id" : ObjectId("4c83b9f94e3f3ef212be6e78"), "title" : "The Sun Also Rises", "author" : "Ernest Hemingway" }
数据排序
数据检索排序是一项常见的任务,使用MongoDB的sort()方法可以轻松完成。例如你要以作者的名字为依据将数据进行升序排列,你只要将作者关键字、名称关联值和整型1传给sort()方法(为使排序结果更加明显,我已经添加了一些书籍)。
{ "_id" : ObjectId("4c83b9eb4e3f3ef212be6e77"), "title" : "The Maltese Falcon", "author" : "Dashiell Hammett" }
{ "_id" : ObjectId("4c83b9b84e3f3ef212be6e76"), "title" : "Farewell to Arms", "author" : "Ernest Hemingway" }
{ "_id" : ObjectId("4c83b9f94e3f3ef212be6e78"), "title" : "The Sun Also Rises", "author" : "Ernest Hemingway" }
{ "_id" : ObjectId("4c83c3e44e3f3ef212be6e79"), "title" : "1984", "author" : "George Orwell" }
{ "_id" : ObjectId("4c83c3f64e3f3ef212be6e7a"), "title" : "Animal Farm", "author" : "George Orwell" }
{ "_id" : ObjectId("4c83c4134e3f3ef212be6e7b"), "title" : "Catcher in the Rye", "author" : "J.D. Salinger" }
如果要以降序排列,你需要将关键字段值置为-1。
${PageNumber}限制结果
限制集合的大小是非常有用的,特别是在执行分页功能时。为了限制结果的数量,使用到limit()方法,并且由find()方法返回,如下所示:
>db.books.find({author:"Ernest Hemingway"}).limit(1)
{ "_id" : ObjectId("4c83b9b84e3f3ef212be6e76"), "title" : "Farewell to Arms", "author" : "Ernest Hemingway" }
结果汇总
正如上面例子所表明的,存储在数据库中的数据的价值不仅仅只是被检索。你会经常考虑有某些方法来分析数据,例如确定每个作者在数据库中的图书数量。要做到这一点,你要汇总数据,计算每个作者的书籍数量。使用MongoDB的group()方法,汇总是很容易实现的,尽管他的语法有些难于理解。下面的例子会生成一张连同数据库中存储的相应作者书籍总数的作者表。
key: {'author': true},
initial: {books: 0},
reduce:
function(doc, prev) {
prev.books += 1
}
});
执行命令后产生如下结果:
{
"author" : "Ernest Hemingway",
"books" : 2
},
{
"author" : "Dashiell Hammett",
"books" : 1
},
{
"author" : "George Orwell",
"books" : 2
},
{
"author" : "J.D. Salinger",
"books" : 1
}
]
如前所述,group()方法对初学者来说有些难于理解,所以我们回顾一下语法:
● key关键字标识我们想要汇总的数据(类似于SQL中GROUP BY子句的参数)
● initial关键字标识我们记录的关键字的关键值的初始值,在上面的例子中,每个作者的书籍数由数据库决定
● reduce关键字定义了一个方法,决定每次遇到一个作者的一本书所要做的工作,在我们的例子中,只想确定每个作者的书籍数量,因此将这个值加一
结论
正如你在这篇文章中了解到的,MongoDB的数据存储和管理方法要求开发者从不同的角度考虑数据检索的过程,而适当的方法使其变得相当轻松。