MongoDB学习笔记一:入门
文档:多个键及其关联的值『有序』地放置在一起。
{"greeting" : "Hello, world!", "foo" : 3}
集合:一组文档。集合是无模式的,下面两个文档可以存在于同一个集合里面:
{"greeting" : "Hello, world!"}
{"foo" : 5}
集合的命名规则:
(1)集合名不能使空字符串""。
(2)集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
(3)集合名不能以"system."开头,这是为系统集合保留的前缀。例如system.users这个保存着数据库的用户信息,system.namespaces集合保存着所有数据库集合的信息。
(4)用户创建的集合名字不能含有保留字符$。
子集合按“.”字符划分。例如,一个带有博客功能的应用肯呢个包含两个集合,分别是blog.posts和blog.authors。这样做的目的是为了使组织结构更好些,虽然blog这个集合和他的子集合没有任何关系。
数据库:多个集合。
MongoDB中多个文档组成集合,多个集合组成数据库。
数据库的命名规则:数据库名可以是满足以下条件的任意UTF-8字符串。
(1)不能是空字符串("")。
(2)不得含有' '(空格)、.、$、/、\和\0(空字符)。
(3)应全部小写。
(4)最多64字节。
因为 数据库名最终会编程文件系统里的文件。
保留的特殊数据库名:
admin:从权限的角度看,这是“root”数据库。如果将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。
local:这个数据永远不会被复制,可以用来存储限于本地单台服务器的集合。
config:当Mongo用于分片设置时,config数据库在内部使用,用于包UC你分片的相关信息。
命名空间 = 数据库名.集合名
例如,如果你在cms数据库中使用blog.posts集合,那么这个集合的命名空间就是cms.blog.posts。
启动MongoDB:
Linux: $ ./mongod
Windows:$ mongod.exe
mongod默认数据目录/data/db(windows下C:\data\db\),默认端口27017。创建数据目录(比如mkdir -p /data/db),并确保对该目录有些权限是很重要的。
mongod还会在端口28017启动一个非常基本的HTTP服务器,可以通过浏览器访问http://localhost:28017来获取数据库的管理信息。
MongoDB shell:MongoDB自带一个JavaScript shell,可以从命令行与mongoDB实例交互。
运行mongo启动shell:
$ ./mongo
shell会在启动时自动连接MongoDB服务器,所以要确保在使用shell之前启动mongod。
shell是功能完备的JavaScript解释器,可以运行任何JavaScripe程序。
shell是一个独立的MongoDB客户端。开启的时候,shell会连到MongoDB服务器的test数据库,并将这个数据库连接赋值给全局变量db。这个变量是通过shell访问MongoDB的主要入口点。
shell还有些非JavaScript语法的扩展,是为了方便习惯于SQL shell的用户而添加的。例如,最重要的操作就是选择要使用的数据库:
> use foobar
switched to db foobar
现在如果看看db,会发现其指向foobar数据库:
> dbfoobar
可以通过db变量访问其中的集合。例如db.baz返回当前数据库的baz集合。
『shell中的基本操作』:创建、读取、更新和删除(CRUD)。
1.创建
例:假设要存储一篇博客文章。首先,创建一个局部变量post,内容是代表文档的JavaScript对象。里面会有"title","content"和"date"(发表日期)几个键。
> post = {"title" : "My Blog Post",
"content" : "Here's my blog post.",
"date" : new Date()}
这个对象是个有效的MongoDB文档,所以可以用insert方法将其保存到blog集合中:
> db.blog.insert(post)
可以调用find方法来查看:
> db.blog.find()
2.读取
find会返回集合里面所有的文档。若只是想查看一个文档,可以用findOne:
> db.blog.findOne()
3.更新
例:第一步修改变量post,增减"comments"键:
> post.comments = []
然后执行update操作,用新版本的文档替换标题为"My Blog Post"的文章:
> db.blog.update({title : "My Blog Post"}, post)
文档此时已经有了"comments"键,可以再用find查看一下:
> db.blog.find()
4.删除
remove用来从数据库中永久性地删除文档。在不使用参数进行调用的情况下,它会删除一个集合内的所有文档。他也可以接受一个文档以指定限定条件。例如,下面的命令会删除我们刚刚穿件的文章:
> db.blog.remove({title : "My Blog Post"})
使用shell的窍门
> help
使用db.help()可以查看数据库级别的命令的帮助;
使用db.foo.help()可以查看集合的相关帮助。
在输入函数的时候不要输括号,会显示该函数的JavaScript源代码。如:
> db.foo.update
要查看shell提供的所有自动生成的JavaScript函数API文档,可访问http://api.mongodb.org/js/
MongoDb的数据类型:
· null
null用于表示空值或者不存在的字段。
{"x" : null}
· 布尔
布尔类型有两个值'true'和'false'
{"x" : true}
· 32位整数
shell中这个类型不可用。JavaScript仅支持64位浮点数,所以32位整数会被自动转换。
· 64位整数
shell也不支持这个类型。shell会使用一个特殊的内嵌文档来显示64位整数。
· 64位浮点数
shell中的数字都是这种类型。下面是一个浮点数:
{"x" : 3.14}
这个也是浮点数:
{"x" : 3}
· 字符串
UTF-8字符串都可以表示为字符串类型的数据:
{"x" : "foobar"}
· 符号
shell不支持这种类型。shell将数据库里的符号类型转换成字符串。
· 对象id
对象id是文档的12字节的唯一ID。
{"x" : ObjectId()}
· 日期
日期类型存储的是从标准纪元开始的毫秒数。不存储时区:
{"x" : new Date()}
· 正则表达式
文档中可以包含正则表达式,采用JavaScript的正则表达式语法:
{"x" : /foobar/i}
· 代码
文档中还可以包含JavaScript代码:
{"x" : function() { /* ... */ }}
· 二进制数据
二进制数据可以由任意字节的串组成。不过shell中无法使用。
· 最大值
BSON包括一个特殊类型,表示可能的最大值。shell中没有这个类型。
· 最小值
BSON包括一个特殊类型,表示可能的最小值。shell中没有这个类型。
· 未定义
文档中也可以使用未定义类型(JavaScript中null和undefined是不同的类型)。
{"x" : undefined}
· 数组
值得集合或列表可以表示成数组:
{"x" : ["a", "b", "c"]}
· 内嵌文档
文档可以包含别的文档,也可以作为值嵌入到父文档中:
{"x" : {"foo" : "bar"}}