MongoDB 在功能和复杂性之间取得了很好的平衡,并且大大简化了原先十分复杂的任务,它具备支撑今天主流 web 应用的关键功能:索引、复制、分片、丰富的查询语法,特别灵活的数据模型。与此同时还不牺牲速度。
MongoDB 是一款强大、灵活,且易于扩展的通用型数据库。能扩展出非常多的功能,如二级索引、范围查询、排序、聚合,以及地理空间索引。
MongoDB 权威指南第 2 版 PDF 完整带书签目录 下载见
MongoDB 是一个面向文档的数据库,比关系型数据库有更好的扩展性。用文档代替行。能够仅使用一条记录来表现发展的层次关系。
文档的键和值不再是固定的类型和大小。
MongoDB 的设计采用横向扩展。面向文档的数据模型使它能很容易的在多台服务器之间进行数据分割。
MongoDB 能自动处理跨集群的数据和负载,自动重新分配文档,以及将用户请求路由到正确的机器上。如果一个集群需要很大的容量,只需向集群添加新服务器,MongoDB 就会自动将现有数据向新服务器传送。
MongoDB 作为一款通用型数据库,除了能够增删改查之外,还有一系列不断扩展的独特功能。
MongoDB 支持通用二级索引,允许多种快速查询,且提供唯一索引、符合索引、地理空间索引,以及全文索引。
MongoDB 支持 "聚合管道"。用户能通过简单的片段创建复杂的聚合,并通过数据库自动优化。
MongoDB 支持存在时间有限的集合,适用于那些将在某个时刻过期的数据,如会话。类似的,MongoDB 也支持固定大小的集合,用于保存近期数据,如日志。
MongoDB 支持一种非常易用的协议,用于存储大文件和文件元数据。
MongoDB 能对文档进行动态填充,也能预分配数据文件以利用额外的空间换取稳定的性能。MongoDB 把尽可能多的内存用作缓存,试图为每次查询自动选择正确的索引。
1. 文档是 MongoDB 中数据的基本单元,非常类似 mysql 的行,但更具表现力。
2. 集合可以看作是一个拥有动态模式的表。
3.MongoDB 的一个实例可以拥有多个相互独立的数据库,每一个数据库都拥有自己的集合。
4. 每一个文档都有一个特殊的键 "_id", 在文档所属的集合中是唯一的。
5.MongoDB 自带 js shell,可用于管理 MongoDB 的实例或数据操作。
文档就是键值对的一个有序集。比如:{"greeting":"hello world!","foo":3}, 文档的键是字符串。键可以是任意 utf-8 字符。除了少数情况:
MongoDB 不但区分类型,而且区分大小写,{"foo":3}、{"foo":"3"}、{"Foo":3} 三个文档是不同的。
MongoDB 的文档不能有重复的键。{"foo":"3","foo",3} 文档非法。
文档中的键值对是有序的。{"x":1,"y":2}与 {"y":2,"x":1} 是不同的。
集合就是一组文档。
集合是动态模式的。这意味着一个集合里面的文档可以是各式各样的。可以放置任何文档,既然如此,为何还要把相关类型的文档组织在一起,使用多个集合,而不是通通放在一个集合里呢?原因如下:
集合使用名称进行标识,可以是任意的 utf-8 字符串,除了以下特殊情况:
组织集合的一种惯例是使用 "." 分隔不同命名空间的子集合。为了使组织结构更清晰,比如(blog.posts 和 blog.authors),虽然子集合没有任何特别的属性,但他们却非常有用。使用子集合来组织数据非常高效。
多个集合可以组成数据库。一个 MongoDB 实例可以承载多个数据库,每个数据库拥有 0 个或多个集合。每个数据库都有独立的权限。不同的数据库放置在不同的文件中。
数据库最终会变成文件系统里的文件,数据库名就是相应的文件名,因此命名会有很多限制。数据库通过名称来标识。可以是任意的 utf-8 字符串,除了以下特殊情况:
有一些数据库名是保留的,可以直接访问这些有特殊语义的数据库。
admin
从身份验证的角度看,这是 "root" 数据库。如果将一个用户添加到了 admin 数据库,将自动获得所有数据库的权限。再者,一些特定的服务端命令也只能从 admin 数据库运行,如列出所有数据库或关闭服务器。
local
这个数据库永远都不可以复制,且一台服务器上的所有本地集合都可以存储在这个数据库中。
config
MongoDB 用于分片设置时,分片信息会存储在 config 数据库中。
window 下,如果配置了环境变量,直接使用 mongod 命令即可。
mongod 在没有任何参数的情况下会默认使用数据目录 /data/db (window 系统中为 C:\data\db). 如果不存在或不可写,服务器会启动失败。
启动时,服务器会打印版本和系统信息,然后等待连接。默认监听发 27017 端口。端口被占用,启动将失败。通常是已经有一个实例在运行了。
mongod 还会启动一个非常基本的 http 服务器,监听 28017 端口,因此,通过 http://localhost:28017, 能获取数据库的管理信息。(测试时找不到网页,不知道哪里没对。)
Shell 中 ctrl+c,中止 mongod 的运行。
Linux 下,启动方式
- [root@yang ~]# cd /usr/local/mongodb/
- [root@yang mongodb]# ./bin/mongod --dbpath /home/m17/ --logpath /home/mlog/m17.log --fork --port 27017
其中 --dbpath 指定数据库存放数据目录,--logpath 指定日志存放目录,--fork 指定为后台线程,--port 指定端口。
Shell 中可以使用命令行与 MongoDB 实例交互。可通过它执行管理操作,检查运行实例等等。启动 shell 使用 mongo 命令,启动时,shell 将自动连接 MongoDB 服务器,须确保 mongod 已启动。
Linux 下,启动方式:
- [root@yang mongodb]# ./bin/mongo
- MongoDB shell version: 3.2.10
- connecting to: test
- Server has startup warnings:
- 2016-11-18T20:35:22.477+0800 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
- 2016-11-18T20:35:22.477+0800 I CONTROL [initandlisten]
- 2016-11-18T20:35:22.478+0800 I CONTROL [initandlisten]
- 2016-11-18T20:35:22.478+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
- 2016-11-18T20:35:22.478+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'
- 2016-11-18T20:35:22.478+0800 I CONTROL [initandlisten]
- 2016-11-18T20:35:22.478+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
- 2016-11-18T20:35:22.478+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'
- 2016-11-18T20:35:22.478+0800 I CONTROL [initandlisten]
Shell 是一个功能完备的 js 解释器。
Shell 是一个独立的 MongoDB 客户端。启动时,shell 会连到 MongoDB 服务器的 test 数据库,并将数据库连接赋值给全局变量 db。这个变量是通过 shell 访问 MongoDB 的主要入口点。
查看当前指向哪个数据库,使用 db 命令
Shell 还包含了一些非 js 语法的扩展。这些扩展并不提供额外的功能,而是一些非常棒的语法糖。比如:
通过 db 变量,可访问其中的集合。几乎所有数据库操作都可以通过 shell 完成。
- > post={
- ... "title":"My Blog Post",
- ... "content":"Here's my blog post.",
- ... "date":new Date()
- ... }
- {
- "title" : "My Blog Post",
- "content" : "Here's my blog post.",
- "date" : ISODate("2016-12-11T13:28:54.930Z")
- }
- > db.blog.insert(post)
- WriteResult({ "nInserted" : 1 })
find():shell 会自动显示最多 20 个匹配的文档
findOne() 只查看一个文档
- > db.blog.find() {
- "_id": ObjectId("584d57e5bf1475cad287df45"),
- "title": "My Blog Post",
- "content": "Here's my blog post.",
- "date": ISODate("2016-12-11T13:42:52.351Z")
- }
- > db.blog.findOne() {
- "_id": ObjectId("584d57e5bf1475cad287df45"),
- "title": "My Blog Post",
- "content": "Here's my blog post.",
- "date": ISODate("2016-12-11T13:42:52.351Z")
- }
接受至少两个参数:
参数 1:限定条件,参数 2:新的文档
- > post = {..."title": "My Blog Post",
- ..."content": "Here's my blog post.",
- ..."date": new Date(),
- ..."comments": []...
- } {
- "title": "My Blog Post",
- "content": "Here's my blog post.",
- "date": ISODate("2016-12-11T13:43:23.118Z"),
- "comments": []
- } > db.blog.update({
- title: "My Blog Post"
- },
- post) WriteResult({
- "nMatched": 1,
- "nUpserted": 0,
- "nModified": 1
- }) > db.blog.find() {
- "_id": ObjectId("584d57e5bf1475cad287df45"),
- "title": "My Blog Post",
- "content": "Here's my blog post.",
- "date": ISODate("2016-12-11T13:43:23.118Z"),
- "comments": []
- }
参数:限制条件
无参数,删除所有文档
- > db.blog.remove({
- title: "My Blog Post"
- }) WriteResult({
- "nRemoved": 1
- }) > db.blog.find()
来源: http://www.linuxidc.com/Linux/2016-12/138257.htm