Awebone's Blog

MongoDB基础学习

MongoDB基础学习

MongoDB是一个跨平台,面向文档的数据库,提供高性能,高可用性和易于扩展。最近在看《MongoDB》权威指南这本书,总结知识点分享给与我一样刚入门MongoDB的人。

基本概念

  • 数据库:数据库是一个集合的物理容器。每个数据库获取其自己设定在文件系统上的文件。一个单一的MongoDB服务器通常有多个数据库

  • 集合:集合是一组MongoDB的文件。它与一个RDBMS表是等效的。一个集合存在于数据库中。集合不强制执行模式。集合中的文档可以有不同的字段。

  • 文档:文档是一组键值对。文档具有动态模式。动态模式是指,在同一个集合的文件不必具有相同一组集合的文档字段或结构,并且相同的字段可以保持不同类型的数据。

  • 文档是MongoDB中数据的基本单元

  • 在MongoDB中,一个MongoDB实例可以承载多个数据库,每个数据库拥有0或多个集合,一个集合拥有多个文档
  • 在同一个MongoDB服务器上存放多个应用那个程序或用户的数据,需要使用不同的数据库
  • 使用BSON格式

使用MongoDB在哪些场景

  • 大而复杂的数据
  • 移动和社会基础设施数据
  • 内容管理和交付
  • 用户数据管理
  • 数据中心

初始化的数据库

  • admin:root数据库,有数据库所以权限
  • local:存储所以本地集合
  • config:存储分片信息

基本数据类型

  • null:空或不存在
  • 布尔型:true或false
  • 数值:默认64位浮点型数值
  • 字符串:UTF-8
  • 日期:自新世纪以来经过的毫秒,不存储时区
  • 正则表达式:与js语法相同
  • 数组:数据列表或数据集
  • 内嵌文档:对象嵌套
  • 对象
    • 对象id是一个12字节的ID,是一个由24个十六进制数字组成的字符串,作为文档唯一标识,一秒钟最多允许每个进程拥有2563个不同的ObjectId
    • ObjectId前四个字节是从标准纪元开始的时间戳,单位为秒
    • 接下来3个字节是所在主机的唯一标识符,机器主机名的散列值
    • 接下来2个字节来自产生ObjectId的进程的进程标识符PID
    • 最后3个字节是一个自动增加的计数器
  • 二进制数据
  • 代码

MongoDB shell

  • 启动时会连到test数据库,并将数据库连接赋值给全局变量db

  • 连接到不同的数据库或服务器
    mongo –nodb
    connect=new Mongo(“host:27017”)
    db=connect.getDB(“myDB”)

  • 帮助

    • help
    • db.foo.update,方法不加括号可查看相应函数的源码
  • 创建.mongorc.js

    • 频繁加载的脚本
    • 移除比较危险的shell辅助函数
    • 指定–norc,可以禁止加载.mongorc.js
  • 定制shell提示:将prompt变量设为一个字符串或函数

  • 编辑符合变量:设置EDITOR

四个基本操作:创建、读取、更新、删除(CRUD)

创建

  • 单个插入:insert

  • 批量插入:batchInsert

删除

  • 删除文档:remove,可接受一个查询文档作为参数

  • 删除集合:drop,不能指定条件

更新

  • update:必须接受两个参数,第一个匹配待更新文档,第二个是修改器文档。接受第三个参数,若为true,则表示这是upsert。接受第四个参数,若为true,则表示更新所有匹配的文档。

  • 原子性的更新修改器

    • $set:指定一个字段的值;$unset:删除指定键
    • $inc:增加已有键的值,不存在则创建,只能用于整型、长整型或双精度浮点型的值
    • $push:向已有数组末尾加入一个元素
      • $each:通过一次$push操作添加多个值
      • $slice:设置最大长度,必须为负整数,相当于建立队列,保留最后的元素
      • $sort:清理元素
    • $addToSet:添加新数据,可以避免重复
    • $pop:可以从数组任何一端删除元素
    • $pull:删除所有匹配的文档
  • upsert:若未找到符合更新条件的文档,则以此为条件创建新文档;若找到相应文档,正常更新。可用于创建又可用于更新。

读取

  • find和findOne

    • 第一个参数用于指定查询条件
    • 第二个参数指定想要返回的键

    • 查询条件

      • $lt,$lte,$gt,$gte,$ne对应小于、小于等于、大于、大于等于、不等于
      • $in:用来查询一个键的多个值
      • $or:在多个键中查询任意给定值

        1
        db.raffle.find({"$or":[{"tricket_no":{"in":[755,542,390]}},{"winner":true}]})
      • $not:用来查询与特定模式不匹配的文档

      • $exists:判定键值是否存在
      • $maxscan:指定本次查询文档数量的上限
      • $min:强制指定下边界
      • $max:强制指定上边界
      • $showDiskLoc:用于显示结果在磁盘的位置
    • 数组查询

      • $all:通过多个元素匹配数组
      • $size:查询特定长度的数组
      • $slice:返回某个键匹配的数组元素的一个子集
      • $elemMatch:指定一组添加,只可用于数组
    • 查询函数

      • limit:限制返回数量
      • skip:忽略一定数量的结果
      • sort:接受一个对象作为参数,键为文档键名,值为排序方向(1为升序,-1为降序)