MongoDB学习笔记一—简介
MongoDB简介
MongoDB在功能和复杂性之间取得了很好的平衡,并且大大简化了原先十分复杂的任务,它具备支撑今天主流web应用的关键功能:索引、复制、分片、丰富的查询语法,特别灵活的数据模型。与此同时还不牺牲速度。
MongoDB是一款强大、灵活,且易于扩展的通用型数据库。能扩展出非常多的功能,如二级索引、范围查询、排序、聚合,以及地理空间索引。
设计特点
易于使用
MongoDB是一个面向文档的数据库,比关系型数据库有更好的扩展性。用文档代替行。能够仅使用一条记录来表现发展的层次关系。
文档的键和值不再是固定的类型和大小。
易于扩展
MongoDB的设计采用横向扩展。面向文档的数据模型使它能很容易的在多台服务器之间进行数据分割。
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的实例或数据操作。
文档(类似mysql的行)
文档就是键值对的一个有序集。比如:{“greeting”:”hello world!”,”foo”:3},文档的键是字符串。键可以是任意utf-8字符。除了少数情况:
- 键不能含有\0(空字符)。这个字符用于表示键的结尾。
- .和$具有特殊意义,只能在特定环境下使用。
MongoDB不但区分类型,而且区分大小写,{“foo”:}、{“foo”:””}、{“Foo”:}三个文档是不同的。
MongoDB的文档不能有重复的键。{“foo”:””,”foo”,}文档非法。
文档中的键值对是有序的。{“x”:,”y”:}与{“y”:,”x”:}是不同的。
集合(类似mysql中的表)
集合就是一组文档。
动态模式
集合是动态模式的。这意味着一个集合里面的文档可以是各式各样的。可以放置任何文档,既然如此,为何还要把相关类型的文档组织在一起,使用多个集合,而不是通通放在一个集合里呢?原因如下:
- 难以管理
- 速度不划算,分开查询多个集合要快得多。
- 把同种类型的文档放在一个集合里,数据会更加集中。磁盘寻道操作更少。
- 在一个集合中只放入一种类型的文档,可以更加有效地对集合进行索引。
命名
集合使用名称进行标识,可以是任意的utf-8字符串,除了以下特殊情况:
- 不能是空字符串(“”)
- 不能包含\0字符(空字符),这个字符表示集合名的结束。
- 不能以”system.”开头,这是为系统集合保留的前缀。例如:system.users保存着数据库的用户信息,system.namespaces保存着所有数据库集合的信息。
- 不能包含保留字符’$’
子集合
组织集合的一种惯例是使用“.”分隔不同命名空间的子集合。为了使组织结构更清晰,比如(blog.posts和blog.authors),虽然子集合没有任何特别的属性,但他们却非常有用。使用子集合来组织数据非常高效。
数据库
多个集合可以组成数据库。一个MongoDB实例可以承载多个数据库,每个数据库拥有0个或多个集合。每个数据库都有独立的权限。不同的数据库放置在不同的文件中。
命名
数据库最终会变成文件系统里的文件,数据库名就是相应的文件名,因此命名会有很多限制。数据库通过名称来标识。可以是任意的utf-8字符串,除了以下特殊情况:
- 不能是空字符串(“”)
- 不得含有/、\、.、’’、*、<、>、:、|、 ?、$(一个空格)、\0(空字符)。基本上,只能使用ASCII中的字母和数字。
- 区分大小写,为简单起见,应全部小写。
- 数据库名最多64字节。
保留数据库名
有一些数据库名是保留的,可以直接访问这些有特殊语义的数据库。
admin
从身份验证的角度看,这是“root”数据库。如果将一个用户添加到了admin数据库,将自动获得所有数据库的权限。再者,一些特定的服务端命令也只能从admin数据库运行,如列出所有数据库或关闭服务器。
local
这个数据库永远都不可以复制,且一台服务器上的所有本地集合都可以存储在这个数据库中。
config
MongoDB用于分片设置时,分片信息会存储在config数据库中。
启动MongoDB
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
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解释器。
MongoDB客户端
Shell是一个独立的MongoDB客户端。启动时,shell会连到MongoDB服务器的test数据库,并将数据库连接赋值给全局变量db。这个变量是通过shell访问MongoDB的主要入口点。
查看当前指向哪个数据库,使用 db命令
Shell还包含了一些非js语法的扩展。这些扩展并不提供额外的功能,而是一些非常棒的语法糖。比如:
通过db变量,可访问其中的集合。几乎所有数据库操作都可以通过shell完成。
Shell中的基本操作
创建 insert()
> 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() 、findOne()
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") }
更新update()
接受至少两个参数:
参数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" : [ ] }
删除remove()
参数:限制条件
无参数,删除所有文档
> db.blog.remove({title:"My Blog Post"})
WriteResult({ "nRemoved" : 1 })
> db.blog.find()
MongoDB学习笔记一—简介的更多相关文章
- MongoDB学习笔记-01 简介、安装
MongoDB简介 MongoDB是一种强大.灵活.可拓展的存储方式.是一个面向文档(相当于"行"的概念)的数据库. 可拓展:通过添加服务器而增加存储量. Windows下安装 版 ...
- mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)
最后更新时间:2017-07-13 11:10:49 原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/ MongoDB - 简介 官网: ...
- MongoDB学习笔记:快速入门
MongoDB学习笔记:快速入门 一.MongoDB 简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.M ...
- MongoDB学习笔记二- Mongoose
MongoDB学习笔记二 Mongoose Mongoose 简介 之前我们都是通过shell来完成对数据库的各种操作, 在开发中大部分时候我们都需要通过程序来完成对数据库的操作 而Mongoose就 ...
- MongoDB学习笔记系列
回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助 ...
- PHP操作MongoDB学习笔记
<?php/*** PHP操作MongoDB学习笔记*///*************************//** 连接MongoDB数据库 **////*************** ...
- Linux内核学习笔记-1.简介和入门
原创文章,转载请注明:Linux内核学习笔记-1.简介和入门 By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...
- MongoDB 学习笔记(原创)
MongoDB 学习笔记 mongodb 数据库 nosql 一.数据库的基本概念及操作 SQL术语/概念 MongoDB术语/概念 解释/说明 database database 数据库 table ...
- MongoDB学习笔记(转)
MongoDB学习笔记(一) MongoDB介绍及安装MongoDB学习笔记(二) 通过samus驱动实现基本数据操作MongoDB学习笔记(三) 在MVC模式下通过Jqgrid表格操作MongoDB ...
随机推荐
- [Javascript] 爬虫 模拟新浪微博登陆
概述: 由于业务需要,要编写爬虫代码去爬去新浪微博用户的信息. 虽然在网上能找到不少信息,但由于新浪微博改版,其登陆机制进行了修改,故很多老的文章就不适合用了. 经过一番摸索,成功模拟新浪微博的登陆 ...
- Android-Eclipse-INSTALL_FAILED_UPDATE_INCOMPATIBLE错误
电脑重装了系统,环境问题一大堆,唉,搞死人,这不,今天就出现了这样的一个奇怪的问题. INSTALL_FAILED_UPDATE_INCOMPATIBLE 最后搜了一遍,发现是因为已经安装了这个包,包 ...
- 设计模式之依赖倒转原则(DIP)
1.概念 DIP:Dependency Inversion Principle 抽象不应当依赖于细节,细节应当依赖于抽象(说通俗点也就是要针对接口编程,不要针对实现编程:或者要依赖于抽象,不要依赖于具 ...
- AngularJS_01之基础概述、设计原则及MVC设计模式
1.AngularJS: 开源的JS框架,用来开发单一页面应用,以及数据操作频繁的场景:2.设计原则: ①YAGNI原则:You Aren't Gonna Need It! 不要写不需要的代码! ②K ...
- Python TODO
参数类型和用法 所有的双划线方法以及特性 类的构建过程 实例的构建过程 元类MetaClass 装饰器 描述符 迭代器 上下文管理器 生成器 lambda 数据结构,集合 垃圾回收机制 类方法,静态方 ...
- 计算照片的面积(UWP篇)
今天先说UWP应用程序上计算照片面积的方法,改天有空,再说说WPF篇. 其实计算照片面积的原理真TMD简单,只要你有本事读到照片的像素高度和宽度,以及水平/垂直方向上的分辨率(DPI)就可以了.计算方 ...
- Step01-题目申报
毕业设计题目申报表 姓名: 王刚 学号: 201303041029 题目名称: 通用型云端物联网网关系统的设计与实现 毕业设计(论文)简介: 2017是物联网进入加速发展或成为最贴近普通民众的实用 ...
- 计算机程序的思维逻辑 (44) - 剖析TreeSet
41节介绍了HashSet,我们提到,HashSet有一个重要局限,元素之间没有特定的顺序,我们还提到,Set接口还有另一个重要的实现类TreeSet,它是有序的,与HashSet和HashMap的关 ...
- 坎坷路:ASP.NET Core 1.0 Identity 身份验证(中集)
上一篇:<坎坷路:ASP.NET 5 Identity 身份验证(上集)> ASP.NET Core 1.0 什么鬼?它是 ASP.NET vNext,也是 ASP.NET 5,以后也可能 ...
- Unity iOS混合开发界面切换思路
Unity iOS混合开发界面切换思路 最近有很多博友QQ 私信 或则 留言联系我,请教iOS和Unity界面之前相互切换的问题,源代码就不私下发你们了,界面跳转功能的代码我直接贴到下面好了,顺带说i ...