mongoDB学习笔记

理论

定义

一个基于分布式文件存储的数据库。由C++语言编写。

特点

  • 存储形式为BSON(Binary Serialized Document Format)
  • 面向集合存储,易存储对象类型的数据。
  • 模式自由。
  • 支持动态查询。
  • 支持完全索引,包含内部对象。
  • 支持查询
  • 支持复制和故障恢复。
  • 使用高效的二进制数据存储,包括大型对象(如视频等)。
  • 自动处理碎片,以支持云计算层次的扩展性
  • 支持RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
  • 文件存储格式为BSON(一种JSON的扩展)。
  • 可通过网络访问。
  • 不支持表连接
  • 文档中的键/值对是有序的
  • 区分类型和大小写

适用场景

在键/值存储方式(提供了高性能和高度伸缩性)和传统的RDBMS 系统(具有丰富的功能)之间架起

网站数据,缓存, 大尺寸、低价值的数据,高伸缩性的场景,用于对象及JSON 数据的存储

Mongo不适用的场景如下:

  • 要求高度事务性的系统。
  • 传统的商业智能应用。
  • 复杂的跨文档(表)级联查询。

元数据

集合命名空间 描述

dbname.system.namespaces 列出所有名字空间。

dbname.system.indexes 列出所有索`引。

dbname.system.profile 包含数据库概要(profile)信息。

dbname.system.users 列出所有可访问数据库的用户。

dbname.local.sources 包含复制对端(slave)的服务器信息和状态。

安装

  • windows,安装到服务
  • linux,网页版访问,–rest

数据类型

String, Integer, Boolean, Double, Min/Max keys, Arrays, Timestamp, Object, Null, Symbol, Date, Object ID, Binary Data, Code, Regular expression,

连接

mongodb:username:password@hostname/dbname

命令

  • use
  • show dbs
  • db.col.insert(doc)
  • db,查看当前数据库名
  • db.dropDatabase()
  • db.col.drop()
  • db.col.find()
  • db.col.save(doc)
  • db.col.update( criteria, objNew, upsert, multi ),db.col.update( 查询条件, update的对象和一些更新的操作符, 不存在是否插入, 是否更新多条记录 )
  • db.col.remove(, { justOne: , writeConcern: } )

  • db.col.find().pretty()

  • db.col.findOne()
  • {key:{比较符号:value},:,lt,gt,gte,lte,ne
  • $or:[{},{}]
  • db.col.find().limit(NUMBER)
  • db.col.find().skip(NUMBER)
  • db.col.find().sort({KEY:1})
  • db.col.ensureIndex({KEY:1})
  • db.posts.dropIndex("post_text_text")
  • db.col.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$sum : 1}}}]),$sum,$avg,$max,$min,$push,$addToSet,$first,$last
  • aggregate的管道,$project,$match,$limit,$skip,$unwind,$group,$sort,$geoNear
  • 全文索引search

类型type

类型 数字
Double 1
String 2
Object 3
Array 4
Binary data 5
Undefined 6
Object id 7
Boolean 8
Date 9
Null 10
Regular Expression 11
JavaScript 13
Symbol 14
JavaScript withscope 15
32-bit integer 16
Timestamp 17
64-bit integer 18
Min key 255
Max key 127

副本配置

  • mongod –port "PORT" –dbpath "YOUR_DB_DATA_PATH" –replSet "REPLICA_SET_INSTANCE_NAME"
  • rs.initiate(),rs.conf(), rs.status()
  • rs.add(HOST_NAME:PORT)

分片

结构

  • Shard:用于存储实际的数据块
  • Config Server:mongod实例
  • Query Routers:前端路由

备份与恢复

  • mongodump -h dbHost –port dbPort -d dbName -c collection -o dbdirectory
  • mongorestore -h dbhost -d dbname –directoryperdb dbdirectory

监控

  • mongostat
  • mongotop

高级

关联查询

  • var result = db.users.findOne({"name":"Tom Benzamin"},{"address_ids":1})
  • var addresses = db.address.find({"_id":{"$in":result[“address_ids”]}})

数据库引用

 "address": {
    "$ref": "address_home",
    "$id": ObjectId("534009e4d852427820000002"),
    "$db": "w3cschoolcc"}

查询分析

  • explain:indexOnly,cursor,n,nscanned,millis,indexBounds
  • hint:强迫MongoDB使用一个指定的索引

原子操作

findAndModify,set,unset,inc,push,pushAll,pull,addToSet,pop,rename,bit

高级索引

  • 数组:db.users.ensureIndex({"tags":1})
  • 子文档:db.users.ensureIndex({"address.city":1,"address.state":1,"address.pincode":1})

索引限制

  • 集合中索引不能超过64个
  • 索引名的长度不能超过125个字符
  • 一个复合索引最多可以有31个字段

ObjectId

  • 12字节 BSON 类型数据,时间戳4+机器标识码3+PID2+随机数3
  • ObjectId("5349b4ddd2781d08c09890f4").getTimestamp()
  • ObjectId.str

正则表达式

db.posts.find({post_text:{$regex:"w3cschool.cn",$options:"$i"}})

Author: bkdwei