Mongodb基础 - littleboy12580/learning_python GitHub Wiki

基础知识

文档

文档是MongoDB的核心概念(地位类似于Mysql的行),文档就是键值对的一个有序集,可以用字典来表示,通常包括多个键值对;文档中的值可以是多种不同的数据类型(甚至可以是一个完整的内嵌文档);文档的键是字符串,除少数例外,键可以使用任意UTF-8字符(键不能包含 \0 (空字符),这个字符用于表示键的结尾)
MongoDB区分类型和大小写,例如下面几个文档是不一样的:

{"foo" : 3}
{"foo" : "3"}
{"Foo" : 3}

MongoDB的文档不能有重复的键
文档中的键值对是有序的,例如下面两个文档是不一样的:

{"x" : 1, "y" : 2}
{"y" : 2, "x" : 1}

集合

集合就是一组文档(可以类比于mysql里的表)

动态模式

集合是动态模式的,即一个集合里面的文档可以是各式各样的(键与类型都可以不同),下面是一个集合的实例:

{"greeting" : "Hello, world"}
{"foo" : 5}

虽然集合里可以放置任何文档,一般还是会使用将相关类型的文档组织在一起作为一个集合的模式来创建多个集合

命名

集合名是UTF-8字符串,需要满足下列条件:

  • 集合名不能是空字符串("")
  • 集合名不能包含 \0 字符(空字符),这个字符表示集合名的结束
  • 集合名不能以 “system.” 开头,这是为系统集合保留的前缀
  • 用户创建的集合不能在集合名中包含保留字符 ‘$’

子集合

组织集合的一种惯例是使用 “.”分隔不同命名空间的子集合,这样可以使组织结构更清晰;例如一个具有博客功能的应用可能包含两个集合,分别是blog.posts和blog.authors;此处的blog集合(该集合甚至可以不用存在)和它的子集合没有任何关系

数据库

多个文档组成集合,多个集合组成数据库;一个MongoDB实例可以承载多个数据库,每个数据库拥有0个或多个集合;数据库命名需要满足如下条件:

  • 不能是空字符串("")
  • 基本上只能使用ASCII中的字母和数字
  • 数据库名区分大小写(一般统一是小写)
  • 数据库名最多64字节

MongoDB中存在一些默认的数据库,如下所示:

  • admin
    相当于root数据库,添加至admin数据库的用户将自动获得所有数据库的权限,一些特定的服务器端命令也只能从admin数据库运行,如列出所有数据库或关闭服务器
  • local
    该数据库永远不可以复制,一台服务器上的所有本地集合都可以存储在该数据库中
  • config
    MongoDB用于分片设置时,分片信息会存储在该数据库中

将数据库名添加到集合名前得到集合的完全限定名级命名空间;命名空间的长度不得超过121字节,且在实际使用中应小于100字节

MongoDB shell基本操作

进入MongoDB shell

命令行输入mongo即可启动shell,默认进入test数据库

切换数据库

输入 use 数据库名即可切换至相应名字数据库

创建

insert函数可将一个文档添加到集合中,以下是一个实例:

db.blog.insert({'title' : 'bbbbb', 'content' : 'bfbfbf', 'hits' : 1})

读取

find和findOne方法可以用于查询集合里的文档

db.blog.find() //查询集合所有文档数据默认应该是20个, find()相当于是find({})
db.blog.findOne() //查询集合一条文档数据,findOne()相当于是findOne({})

更新

使用update方法来更新,update接受两个(至少)参数,第一个是限定条件(用于匹配待更新的文档),第二个是新的文档,示例如下:

//首先修改变量post,增加“comments”键
> post.comments = []
//然后执行update操作,用新版本的文档替换标题为“My Blog Post”的文档
> db.blog.update({title : "My Blog Post"}, post)

删除

使用remove方法将文档从数据库中永久删除,如果没有任何参数,则会将集合内的所有文档全部删除,可以接受一个作为限定条件的文档作为参数,示例如下:

>db.blog.remove({title : "My Blog Post"})

数据类型

基本数据类型

  • null
    用来表示空值或者不存在的字段
  • 布尔型
    true和false
  • 数值
    默认使用64位浮点型数值,对于整型值,可使用NumberInt类(表示4字节带符号整数)或NumberLong了(表示8字节带符号整数)
  • 字符串
    UTF-8字符串都可以表示为字符串类型的数据
  • 日期
{"x" : new Date()}
  • 正则表达式
    查询时可以使用正则表达式作为限定条件,语法与javascript的正则表达式语法相同
  • 数组
    数据列表或数据集可以表示为数组
  • 内嵌文档
    文档可嵌套其他文档,被嵌套的文档作为父文档的值
  • 对象id
    对象id是一个12字节的ID,是文档的惟一标识
  • 二进制数据
    二进制数据是将非UTF-8字符保存到数据库中的唯一方式
  • 代码
    查询和文档中可以包括任意Javascript代码

数组

数组是一组值,它既能作为有序对象(如列表、栈、队列),也能做为无序对象(如数据集)来操作;数组可包含不同数据类型的元素,常规的键值对支持的所有值都可以作为数组的值,数组中甚至可以嵌套数组

_id 和ObjectId

MongoDB中存储的文档必须有一个“ _id ”键,该值可以是任何类型的,默认是个ObjectId对象,在一个集合里,每个文档都有惟一的“ _id ”,ObjectId是“_id”的默认类型,采用12字节的存储空间,是一个由24个十六进制数字组成的字符串

常用MongoDB的shell命令

数据库连接

mongo some-host:30000/myDB                          #将db指向 some-host:30000上的myDB数据库
mongo --nodb                                     #启动mongo时不指向任何数据库
conn = new Mongo("some-host:30000")
db = conn.getDB("myDB")                           #连接至某数据库

help函数

使用db.help()来查看数据库级别的帮助,使用db.foo.help()来查看集合级别的帮助,示例如下:

db.foo.update

执行脚本

mongo script1.js script2.js script3.js                       #依次执行三个脚本
mongo --quiet server-1:30000/foo script1.js script2.js script3.js                                            #将db指向server-1:30000上的foo数据库,然后依次执行三个脚本

辅助函数

use foo       #相当于mysql的use database
show dbs        #相当于mysql的show databases
show collections          #相当于mysql的show collections

.mongorc.js文件

 .mongorc.js文件会在启动shell时自动运行,可以使用该脚本创建一些需要的全局变量,或者重写内置的函数;在启动shell时指定 --norc参数可以禁止加载  .monogorc.js文件

编辑复合变量

对于大块的代码或对像,可以通过在shell中设置EDITOR变量来调用编辑器去编辑,命令如下:

EDITOR = "/usr/bin/emacs"                #编辑器地址

如果想要编辑一个变量,可以使用"edit 变量名"来跳到编辑器去编辑该变量(在.mongorc.js文件中添加 EDITOR="编辑器路径"可以设置默认编辑器)