kernelsky 发表于 2018-10-27 08:54:21

MongoDB基础理念及操作初探

  MongoDB是一个高性能,开源,无模式的文档型数据库,它在许多场景下可用于替代传统的关系型数据库或键/值存储方式
  基础概念:
  NoSQL
  泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。
  NoSQL的特点:
  ·分关系型
  ·分布式
  ·不提供ACID功能
  本身常用技术特点:
  ·数据模型非常简单(每个记录只有单独的键
  ·元数据和应用数据分离
  ·弱一致性
  其优势:
  ·避免不必要的复杂
  对于web应用来讲,有些一致性有些多余,所以最适用于web2.0的应用场景
  ·高吞吐量
  ·高 水平扩展和低端硬件集群
  ·不使用关系型映射(所以使用的模型非常简单)
  其劣势:
  ·不支持ACID (不能支持事物,但通常生产环境都是两种数据库结合)
  ·功能过于简单
  ·没有统一的数据查询模型
  NoSQL数据库类别:
  ·键值存储
  ·列式数据库
  ·文档数据库
  每一行都相当于独立的文件
  ·图式数据库
  存放的为图,有着复杂对象关系的视图,比如在社交网站存储每个用户之间的关系的时候,通常需要用这种模式进行存储
  ·缓存数据库系统:不具备存储能力,完全用来提供缓存,比如Memcached、Redis
  ·CAP Therorem
  C,A模型:保证一致性和可用性 就是传统数据库-sql数据库
  C,P模型:悲观加锁机制(最终一致性 )
  A,P模型:只保证可用性 和分区容忍性 比如DNS
  ·ACID & BASE
  主要评估于系统本身基本的可用能力 软状态 以及能实现最终一致性,分布式集群中一般都使用BASE
  而数据一致性模型分为以下几种:
  ·强一致性
  无论更新操作在哪个副本上执行,之后的操作都能获得一致性的数据
  ·弱一致性
  用户对某一数据更新需要一定的时间,将由一定的时间段处于不一致状态,在这段时间内为弱一致性
  ·最终一致性
  数据一致性的实现技术:
  ·Quorum系统 NRW策略
  N:总的副本数
  R:完成度操作所需要读取最少副本数
  W:完成写操作所需要写入最少副本数
  强制一致性 R+W>N
  比如 :mysql一主两从
  最终一致性 R+W
  如果打开一个数据库可以
  show collection
  show users 可以显示用户的信息
  show profile 显示性能剖析,必须打开相关功能才可以
  show logs 显示日志文件
  MongoDB安装及CRUD操作
  创建数据库:
  (无需创建)
  > use testdb
  switched to db testdb
  > show dbs
  admin   (empty)
  local   0.078125GB
  > show collections
  可以看到,没有其数据库,因为真正创建数据之前 数据库是不能够被创建的
  插入数据:
  > db.testcoll.insert ( {name:"tom"})
  > show collections
  system.indexes
  testcoll
  #由此看到 索引是自动生成的
  #查看是否存在数据:
  #将集合中查找数据,空为所有
  > db.testcoll.find()
  { "_id" : ObjectId("531fac302d14ad45ff3edbdd"), "name" : "tom" }
  #在mongodb中,默认为集合中为每个文档中自动生成一个对应的ID,而每个ID的号码是随机的
  再次插入:
  > db.testcoll.insert ({name:"jerry"})
  > db.testcoll.find()
  { "_id" : ObjectId("531fac302d14ad45ff3edbdd"), "name" : "tom" }
  { "_id" : ObjectId("531faced2d14ad45ff3edbde"), "name" : "jerry" }
  #前缀号不同,尾号编码按顺序加1
  查看状态
  > db.testcoll.stats()
  {
  "ns" : "testdb.testcoll",         #名字为testdb库下的testcoll
  "count" : 2,                  #有2行数据
  "size" : 76,                        #Collectionl大小是多少
  "avgObjSize" : 38,               #平均每个obj的大小是多少
  "storageSize" : 4096,            #存储时占用的空间大小
  #扩展块等等-----
  "numExtents" : 1,
  "nindexes" : 1,
  "lastExtentSize" : 4096,
  "paddingFactor" : 1,
  "systemFlags" : 1,
  "userFlags" : 0,
  "totalIndexSize" : 8176,
  "indexSizes" : {
  "_id_" : 8176
  },
  "ok" : 1
  }
  删除集合
  > db.testcoll.drop ()
  true
  > show collections
  system.indexes
  可以看到,我们虽然清空了集合但是数据库依然在,因为数据库初始化的时候很多数据都已经被保存下来了,而且相对来说还不算小,因为它要存储日志等相关信息的
  > show dbs;
  admin   (empty)
  local   0.078125GB
  testdb   0.203125GB
  进入到相关目录查看存储了哪些文件
  # cd /mongodb/data/
  # ll
  total 294936
  drwxr-xr-x 2 mongod mongod      4096 Mar 12 08:37journal   #
  -rw------- 1 mongod mongod67108864 Mar 12 08:24 local.0          #local数据库
  -rw------- 1 mongod mongod16777216 Mar 12 08:24 local.ns
  -rw------- 1 mongod mongod67108864 Mar 12 08:45testdb.0         #testdb数据库
  -rw------- 1 mongod mongod 134217728 Mar 12 08:37 testdb.1
  -rw------- 1 mongod mongod16777216 Mar 12 08:45testdb.ns
  drwxr-xr-x 2 mongod mongod   4096 Mar 12 08:37 _tmp
  MongoDB常用操作:
  如何实现查询
  collection名称+find方法(查询标准比如年龄大于某个数字).sort为排序默认以升序排序,如下所示
  CollectionQueryCriteriaModifiler
  db.User.find( {age:{ $gt:18 } } ).sort ( { age:1 } )
  每个find都会返回一个游标,所以将符合条件的所有的 collection执行的字段全部返回
  需要注意的是使用find查询的时候 图中只显示的是查询标准没有声明显示哪些字段,那么其将所有符合collection的字段全部打印,如果想找出符合头一个collection的字段,那么则需要使用find1方法 只查询一个
  创建文档
  因为支持javascript语法架构因此支持for循环:
  > for(i=1;i db.testcoll.find()
  { "_id" : ObjectId("531fb4ce6188101d937d4fd0"),"Name" : "User1", "Age" : 1, "Gender" :"M", "preferbook" : ["blue book", "yellow book" ] }
  { "_id" : ObjectId("531fb4ce6188101d937d4fd1"),"Name" : "User2", "Age" : 2,
  #--------------------此处略--------------------------
  { "_id" : ObjectId("531fb4ce6188101d937d4fe3"),"Name" : "User20", "Age" : 20, "Gender": "M", "preferbook" : ["blue book", "yellow book" ] }
  Type "it" for more
  #默认值能显示20个 需要键入it命令 来查看以下航
  使用limit限定特定行数
  > db.testcoll.find().limit(3)
  { "_id" : ObjectId("531fb4ce6188101d937d4fd0"),"Name" : "User1", "Age" : 1, "Gender" :"M", "preferbook" : ["blue book", "yellow book" ] }
  { "_id" : ObjectId("531fb4ce6188101d937d4fd1"),"Name" : "User2", "Age" : 2, "Gender" :"M", "preferbook" : ["blue book", "yellow book" ] }
  { "_id" : ObjectId("531fb4ce6188101d937d4fd2"),"Name" : "User3", "Age" : 3, "Gender" :"M", "preferbook" : ["blue book", "yellow book" ] }
  删除行
  > db.testcoll.remove({Age:10})
  > db.testcoll.find().limit(11)
  { "_id" : ObjectId("531fb4ce6188101d937d4fd8"),"Name" : "User9", "Age" : 9, "Gender" : "M", "preferbook" :["blue book","yellow book" ] }
  { "_id" : ObjectId("531fb4ce6188101d937d4fda"),"Name" : "User11", "Age" : 11, "Gender" : "M","preferbook" : ["blue book","yellowbook" ] }
  { "_id" : ObjectId("531fb4ce6188101d937d4fdb"),"Name" : "User12", "Age" : 12, "Gender" : "M","preferbook" : ["blue book","yellowbook" ] }
  删除用户名为User14的行删除
  > db.testcoll.remove({Name:"User14"})
  删除用户名为User12 改为32
  > db.testcoll.update({Name:"User12"},{$set: {Age:32}})
  查找(find)条件:
  格式:db.testcoll.find”(,)”
  find类似于SQL语句中的SELECT语句,其中相当于sql语句总的where自居,而相当于要选定的字段
  如果使用find()格式中不包含,那么意味着返回对应的结果的所有的文档
  查找年龄大于93的用户
  > db.testcoll.find({Age: {$gte:93}})
  如果只想只显示用户名和姓名和年龄:
  > db.testcoll.find({Age: {$gte:93}},{Name: 1, Age: 1})
  #{Name: 1,         #表示显示用户名
  # Age: 1}      #表示显示年龄
  :1表示 to的意思 意思为将其显示出来
  用于多个选择条件
  逻辑运算
  逻辑运算一般用于多个选择条件,MongoDB支持的逻辑运算如下几种:
  $or      或运算
  $and      与运算
  $not      非运算
  $nor      反运算
  例:
  > db.testcoll.find({$and: [{Age: {$gt 61}},{Age: {$lt: 80}}]})
  元素查询(element)
  如果要根据文档中是否存在某字段等条件来挑选文档,则需要用到元素运算
  $exists      根据指定字段的存在性挑选文档
  $mod         将指定字段的值进行取模运算,并返回其余数为指定的文档
  $type         返回指定字段的值类型为指定类型的文档
  例:
  > db.testcoll.insert({Name: "User101",Age:101,Gender:"F", Address: "BeiJing"})
  查找只有address的文档
  > db.testcoll.find({Address: {$exists:true}})
  { "_id" : ObjectId("531fc4bf4b7e74e8a40e004e"),"Name" : "User101", "Age" : 101,"Gender" : "F", "Address" : "BeiJing" }
  true为包含,如果改为flase则取反
  更新操作
  使用multi更改多个
  将年龄大于80的用户的性别全部改为F
  > db.testcoll.update({Age: {$gt:80}},{$set: {Gender: "F"}},{multi: ture})
  删除指定字段,使用unset指定字段列表
  > db.testcoll.update({Name: "User80"},{$unset: {preferbook:""}})

页: [1]
查看完整版本: MongoDB基础理念及操作初探