mongoDB是一种强大,灵活,可扩展的数据存储方式,它扩展了关系型数据库的众多有用功能,如辅助索引,范围查询和排序。mongoDB容易上手,便于使用,它是面向文档的数据库,不是关系型数据库。
文档是mongoDB中数据的基本单元,类似于关系型数据库中的行,但mongoDB中的文档要比行复杂的多;类似的集合可以被看做是没有模式的表;mongoDB的单个实例可以容纳多个数据库,每一个都有自己的集合和权限;mongoDB自带简洁但功能强大的javascript shell ,这个工具对于管理mongoDB实例和数据库操作的作用非常大;每一个文档都有一个特殊的键"_id",它在文档所处的集合中是惟一的,是自动生成的。
文档是mongoDB的核心概念,多个键及其关联的值有序的放置在一起就是文档。文档中的键/值对是有序的,{“foo”:1, "bar":2} 和 {“bar”:2, "foo":1}是两个完全不同的文档。文档的键是字符串,值可以是其他的数据类型甚至可以是整个嵌入的文档。MongoDB区分类型,区分大小写,文档中不能有重复的键。
集合就是一组文档,是无模式的,这意味着一个集合里的文档是各式各样的。
mongoDB中的多个文档组成集合,同样多个集合可以组成数据库。一个mongoDB实例可以承载多个数据库,它们之间可视为完全独立的。每个数据库都有独立的权限控制,即使是在磁盘上,每个数据库也放在不同的文件中。
下面主要介绍mongoDB的一些基本操作。比如我们创建了一个数据库db,一个集合blog
1.插入
insert函数添加一个文档到集合里。
> post = {"title":"my blog post", "content": "here is my blog post"}
> db.blog.insert(post)
当执行插入的时候,使用的驱动程序会将数据转换成BSON的形式,然后将其送入到数据库。数据库解析BSON,检验是否包含“_id”键,并且文档不超过4MB,除此之外,不做别的数据验证,就知识简单的将文档存入数据库。它能让数据库更加的安全,mongoDB在插入时并不执行代码,远离了注入式攻击。
2.读取
find会返回集合里所有的文档,如果想返回一个文档,findOne.
> db.blog.find() //会返回集合中所有的文档
> db.blog.findOne() //会返回集合中的一个文档
> db.blog.find({"title": "blog"}) //会返回集合中所有title值是blog的文档,也就是说find,findOne可以接受查询文档形式的限制条件
3.更新
update至少接受2个参数,第一个是要更行文档的限制条件(就是标识要更新哪个文档),第二个是新的文档(就是用来替换就得文档)。
> post.comments = [] //post增加一个新的键“comments”
>db.blog.update({"title":"my blog post"}, post) //用新的post来替换title为“my blog post”的文档
4.删除
remove用来从数据库中永久性的删除文档。在不适用参数的情况下,删除集合中所有的文档,它也可以接受一个文档以指定限定条件。
>db.blog.remove() //删除集合中的所有的文档
>db.blog.remove("title":"my blog post") //仅删除title值为“my blog post”的文档
remove删除集合中的所有的文档,并不删除索引
5.save
save 是一个shell函数,可以再文档不存在时插入,存在时更新。它只有一个参数:文档。
> var x = db.foo.findOne()
> x.num = 42
> db.foo.save(x)
> db.foo.findOne()
{"num":42}
6.索引
索引是用来加速查询的,建立索引的方法是用ensureIndex
> db.people.ensureIndex("username":1) //对username建立索引,提高查询速度,在同一个集合里,同样的索引只需要创建一次,反复创建时徒劳的。键值1表示的是索 引创建的方向(升序还是降序)
唯一索引可以确保集合中的每一个文档的指定键的值是惟一的。
在创建唯一索引的时候,如果集合中的键的值有重复,那么唯一索引就会创建失败,可以用dropDups来消除重复
> db.people.ensureIndex({"username":1}, {"unique":true, "dropDups":true}) //创建“username”为唯一索引
索引的元信息存储在每个数据库的system.indexs集合中,这是一个保留集合,不能对其插入和删除文档。操作只能通过ensureIndex和dropIndexs进行。
> db.runCommand({“dropIndexs”: "foo", "index":"alphabet"})
要删除所有的索引,将index赋值为*
> db.runCommand({"dropIndexs": "foo", "index":"* "})
另外一种删除索引的办法就是删除集合,这会把_id索引也删除了。
7.count
count是最简单的聚合工具,返回集合中的文档
>db.foo.count()