MongoDB基本原理

一、基本概念

Mongodb是一款非关系型数据库,区别于关系型数据库最显著的特征就是没有SQL语句,数据没有固定的数据类型,不用 SQL 作为查询语言的数据存储系统,而文档数据库 MongoDB 正是NoSQL 的代表。
 
二、特点
1. MongoDB中的记录是一个文档,它是由字段和值对组成的数据结构。MongoDB文档类似于JSON对象。字段的值可以包括其他文档,数组和文档数组。MongoDB数据模型和你的对象在内存中的表现形式一样,一目了然的对象模型。
2.同一个集合中可以包含不同字段(类型)的文档对象:同一个集合的字段可能不同
3.线上修改数据模式,修改时应用与数据库都无须下线
 
三、关系型数据库和文档型数据库主要概念对应
 
关系型数据库
文档型数据库
模型实体 
集合
模型属性
字段
模型关系
表关联
内嵌数组,引用字段关联 

四、基本操作

1.添加数据

  1) db.集合.insertOne(<JSON对象>) // 添加单个文档
  2) db.集合.insertMany([{<JSON对象1>},{<JSON对象2>}]) // 批量添加文档
  3) db.集合.insert() // 添加单个文档 
2.创建文档
1 db.collection.insertOne(
2 doc ,
3 {
4 writeConcern: 安全级别 // 可选字段
5 }
6 )
writeConcern 定义了本次文档创建操作的安全写级别简单来说, 安全写级别用来判断一次数据库写入操作是否成功,安全写级别越高,丢失数据的风险就越低,然而写入操作的延迟也可能更高。
writeConcern 决定一个写操作落到多少个节点上才算成功。 writeConcern的取值包括
  0: 发起写操作,不关心是否成功
  1- 集群中最大数据节点数: 写操作需要被复制到指定节点数才算成功
  majority: 写操作需要被复制到大多数节点上才算成功
  发起写操作的程序将阻塞到写操作到达指定的节点数为止
1 db.emp.insertOne(
2 {
3 name:"zhangsan",
4 age:20,
5 sex:"m"}
6 );
  插入文档时,如果没有显示指定主键,MongoDB将默认创建一个主键,字段固定为_id,ObjectId()可以快速生成的12字节id 作为主键,ObjectId 前四个字节代表了主键生成的时间,精确到秒。主键
ID在客户端驱动生成,一定程度上代表了顺序性,但不保证顺序性, 可以通过ObjectId("id值").getTimestamp() 获取创建时间。
3.创建多个文档
1 db.collection.insertMany(
2 [ {doc } , {doc }, ....],
3 {
4 writeConcern: doc,
5 ordered: true/false
6 }
7 )
  ordered: 觉得是否按顺序进行写入
  顺序写入时,一旦遇到错误,便会退出,剩余的文档无论正确与否,都不会写入
  乱序写入,则只要文档可以正确写入就会正确写入,不管前面的文档是否是错误的文档
  MongoDB以集合(collection)的形式组织数据,collection 相当于关系型数据库中的表,如果collection不存在,当你对不存在的collection进行操作时,将会自动创建一个collection
4.整个文档查询
  db.inventory.find({}) 查询所有的文档
  db.inventory.find({}).pretty() 返回格式化后的文档
5.条件查询
  1) 精准等值查询
    db.inventory.find( { status: "D" } );
    db.inventory.find( { qty: 0 } );
  2) 多条件查询
    db.inventory.find( { qty: 0, status: "D" } );
  3) 嵌套对象精准查询
    db.inventory.find( { "size.uom": "in" } );
  4) 返回指定字段
    db.inventory.find( { }, { item: 1, status: 1 } );
    默认会返回_id 字段, 同样可以通过指定 _id:0 ,不返回_id 字段
  5) 条件查询 and
    db.inventory.find({$and:[{"qty":"0"},{"status":"A"}]}).pretty();
  6) 条件查询 or
    db.inventory.find({$or:[{"qty":"0"},{"status":"A"}]}).pretty();
  Mongo查询条件和SQL查询对照表
SQL MQL
a<>1 或者 a!=1 
{ a : {$ne: 1}} 
a>1 
{ a: {$gt:1}} 
a>=1 
{ a: {$gte:1}} 
a<1
{ a: {$lt:1}} 
a<=1
{ a: {$lte:1}} 
in
{ a: { $in:[ x, y, z]}} 
not in
{ a: { $nin:[ x, y, z]}} 
a is null
{ a: { $exists: false }} 
    insertOne, inertMany, insert 的区别
    insertOne, 和 insertMany命令不支持 explain命令
    insert支持 explain命令
6.复合主键
  1)可以使用文档作为复合主键
1 db.demeDoc.insert(
2 {
3 _id: { product_name: 1, product_type: 2},
4 supplierId:" 001",
5 create_Time: new Date()
6 }
7 )
    注意复合主键,字段顺序换了,会当做不同的对象被创建,即使内容完全一致
7.逻辑操作符匹配
  $not : 匹配筛选条件不成立的文档
  $and : 匹配多个筛选条件同时满足的文档
  $or : 匹配至少一个筛选条件成立的文档
  $nor : 匹配多个筛选条件全部不满足的文档
8.字段匹配 
  $exists:匹配包含查询字段的文档 : { field : {$exists: <boolean>} }
  文档游标:cursor.count( applySkipLimit) 
    默认情况下 , count不会考虑 skip 和 limit的效果,如果希望考虑 limit 和 skip ,需要设置为 true。 分布式环境下,count 不保证数据的绝对正确
    cursor.sort( <doc>),这里的<doc> 定义了排序的要求 ,{ field: ordering} ,1 表示由小到大, -1 表示逆向排序 
    当同时应用 sort, skip, limit 时 ,应用的顺序为 sort, skip, limit
  文档投影: 可以有选择性的返回数据 ,db.collection.find( 查询条件, 投影设置) 
       投影设置:{ field: < 1 :1 表示需要返回, 0: 表示不需要返回 , 只能为 0,或者1 , 非主键字段,不能同时混选0 或 1>} 
       使用 $slice 返回数组中的部分元素
         slice: 值
          1: 数组第一个元素
          -1:最后一个元素
          -2:最后两个元素
          slice[ 1,2 ] : skip, limit 对应的关系
       使用 elementMatch 进行数组元素进行匹配
          查询tag数组中第一个匹配"00" 的元素
1 db.members.find(
2 {},
3 {_id:0,
4 nickName:1,
5 points:1,
6 tag: { $elemMatch: {$eq: "00" } }
7 });
          $elemMatch 和 $ 操作符可以返回数组字段中满足条件的第一个元素
9.更新操作 
  1)updateOne/updateMany 方法要求更新条件部分必须具有以下之一,否则将报错
    $set 给符合条件的文档新增一个字段,有该字段则修改其值
    $unset 给符合条件的文档,删除一个字段
    $push: 增加一个对象到数组底部
    $pop:从数组底部删除一个对象
    $pull:如果匹配指定的值,从数组中删除相应的对象
    $pullAll:如果匹配任意的值,从数据中删除相应的对象
    $addToSet:如果不存在则增加一个值到数组
  2)更新文档
    db.collection.update( <query>,<update>,<options>) 
    <query> 定义了更新时的筛选条件
    <update> 文档提供了更新内容
    <options> 声明了一些更新操作的参数
    更新文档操作只会作用在第一个匹配的文档上,如果<update> 不包含任何更新操作符,则会直接使用update 文档替换集合中符合文档筛选条件的文档
  3)更新特定字段
    db.collection.update( <query>,<update>,<options>)
    <query> 定义了更新时的筛选条件
    <update> 文档提供了更新内容
    <options> 声明了一些更新操作的参数
    如果<update>只包含更新操作符,db.collection.update() 将会使用update更新集合中符合 <query>筛选条件的文档中的特定字段。
10.更新操作符
  $set 更新或新增字段
  $unset删除字段
  $rename 重命名字段
  $inc 加减字段值
  $mul 相乘字段值
  $min 采用最小值
  $max 次用最大值
11.删除文档
  db.collection.remove(<query>,<options>) 
  默认情况下,会删除所有满足条件的文档, 可以设定参数 { justOne:true},只会删除满足添加的第一条文档
12.删除集合 
  db.collection.drop( { writeConcern:<doc>}) 
  <doc> 定义了本次删除集合操作的安全写级别
  这个指令不但删除集合内的所有文档,且删除集合的索引
  db.collection.remove 只会删除所有的文档,直接使用remve删除所有文档效率比较低,可以使用
  drop 删除集合,才重新创建集合以及索引。
13.删除文档 
  db.userInfo.remove({ 条件查询}); 
posted @ 2024-04-07 23:05  京木木  阅读(486)  评论(0)    收藏  举报