MongoDB基础

目录

为什么我们要使用MongoDB?

MongoDB要注意的问题

MongoDB结构介绍

MongoDB中的key命名规则如下:

常用命令

MongoDB增删改命令

索引命令

管理命令

索引设置及查询优化

db profiling

分析器:


为什么我们要使用MongoDB?

 

特点:

  • 高性能、易部署、易使用,存储数据非常方便。主要功能特性有:
  • 面向集合存储,易存储对象类型的数据。
  • 模式自由。
  • 支持动态查询。
  • 支持完全索引,包含内部对象。
  • 支持查询。
  • 支持复制和故障恢复。
  • 使用高效的二进制数据存储,包括大型对象(如视频等)。
  • 自动处理碎片,以支持云计算层次的扩展性
  • 支持Python,PHP,Ruby,Java,C,C#,Javascript,Perl及C++语言的驱动程序,社区中也提供了对Erlang及.NET等平台的驱动程序。
  • 文件存储格式为BSON(一种JSON的扩展)。
  • 可通过网络访问。

功能:

  • 面向集合的存储:适合存储对象及JSON形式的数据。
  • 动态查询:Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
  • 完整的索引支持:包括文档内嵌对象及数组。Mongo的查询优化器会分析查询表达式,并生成一个高效的查询计划。
  • 查询监视:Mongo包含一个监视工具用于分析数据库操作的性能。
  • 复制及自动故障转移:Mongo数据库支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。复制的主要目标是提供冗余及自动故障转移。
  • 高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)
  • 自动分片以支持云级别的伸缩性:自动分片功能支持水平的数据库集群,可动态添加额外的机器。

适用场合:

  • 网站数据:Mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
  • 缓存:由于性能很高,Mongo也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo搭建的持久化缓存层可以避免下层的数据源 过载。
  • 大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。
  • 高伸缩性的场景:Mongo非常适合由数十或数百台服务器组成的数据库。Mongo的路线图中已经包含对MapReduce引擎的内置支持。
  • 用于对象及JSON数据的存储:Mongo的BSON数据格式非常适合文档化格式的存储及查询。

MongoDB要注意的问题

1 因为MongoDB是全索引的,所以它直接把索引放在内存中,因此最多支持2.5G的数据。如果是64位的会更多。

2 因为没有恢复机制,因此要做好数据备份

3 因为默认监听地址是127.0.0.1,因此要进行身份验证,否则不够安全;如果是自己使用,建议配置成localhost主机名

4 通过GetLastError确保变更。(这个不懂,实际中没用过

MongoDB结构介绍

MongoDB中存储的对象时BSON,是一种类似JSON的二进制文件,它是由许多的键值对组成。如下所示

{  
"name" : "huangz",  
"age" : 20,  
"sex" : "male"  
}  
{    
"name" : "jack",  
"class" : 3,  
 "grade" : 3  
} 

而数据库的整体结构组成如下:

键值对--》文档--》集合--》数据库

MongoDB的文件单个大小不超过4M,但是新版本后可提升到16M

MongoDB中的key命名规则如下:

  • "\0"不能使用
  • 带有"."号,"_"号和"$"号前缀的Key被保留
  • 大小写有区别,Age不同于age
  • 同一个文档不能有相同的Key
  • 除了上面几条规则外,其他所有UTF-8字符都可以使用

常用命令

数据库操作

#查看所有数据库,如果没有数据将不显示
show dbs;

#创建库
use test;

#删除当前数据库
db.dropDatabase();

#查看主从复制状态
db.printReplicationInfo();

#修复数据库
db.repairDatabase();

#设置profiling,0:off 1:slow 2 all
db.setProfilingLevel(1);

#查看profiling
show profiling;

#拷贝数据库
db.copyDatabase('test','xingootest1');
db.copyDatabase("test","temp","127.0.0.1");

集合操作 

#查看所有的collection集合
show collections;

#新增集合
db.createCollection(name, options);

eg.
use nias;                                 --switched to db nias 
db.createCollection("sysuser");           --{ "ok" : 1 }
show collections; 

db.createCollection("testCollection", { capped : true, autoIndexId : true, size : 6142800, max : 10000 });

#capped: (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。当该值为 true 时,必须指定 size 参数。
#autoIndexId:(可选)如为 true,自动在 _id 字段创建索引。默认为 false。
#size: (可选)为固定集合指定一个最大值(以字节计)。如果 capped 为 true,也需要指定该字段。
#max: (可选)指定固定集合中包含文档的最大数量。

#删除集合collection
db.collection.drop();

#查看各个collection的状态
db.printCollectionStats();

用户操作

#创建用户
#要进入相应的库里建用户 
use receiver;
db.createUser({
    user: 'testUser',
    pwd: '123456',
    roles: [ { role: "readWrite", db: "receiver" } ]
});

#mongoDB 没有无敌用户root,只有能管理用户的用户 userAdminAnyDatabase

#查看用户是否创建成功
show users;

#修改用户密码
db.changeUserPassword('testUser','123456');

#验证用户
db.auth('testUser','123456');


索引

#索引的创建 
db.collection.createIndex(keys, options);
eg:
db.collection.createIndex({"name":1});

#全文索引
db.collection.createIndex({'name':'text'}) #MongoDB的全文索引自带分词功能

#查看集合索引
db.col.getIndexes();

eg.
db.collection.getIndexes()
[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_", #索引名字
        "ns" : "receiver.busReceiverEntity"
    }
]

#查看集合索引大小
db.collection.totalIndexSize();

#删除集合所有索引
db.collection.dropIndexes();

#删除集合指定索引
db.collection.dropIndex("索引名称");

#强制命中索引
db.collection.find({"name":/张三/}).hint('name_1').count(); #'name_1'为索引名

MongoDB增删改命令

新增 db.collection.insert()

新增一条:db.collection.insert({...})
新增多条:db.collection.insert([{...},{...},...])

更新db.collection.update()

更新一条或者多条,没有设置multi为true,则默认更新一条,
db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>, 没有查询到是否插入一条
     multi: <boolean>是否修改多条
   }
)

查询:db.collection.find()

db.collection.find({...})

删除db.collection.remove()

删除一条或多条,
db.collection.remove(
   <query>,
   {
     justOne: <boolean>是否只删除一条
   }
)

计数统计 db.collection.count()

db.collection.count({...})

聚合db.collection.aggregate()
 

db.collection.bulkWrite()
执行多个操作:
db.collection.bulkWrite(
   [
      { insertOne : <document> },
      { updateOne : <document> },
      { updateMany : <document> },
      { replaceOne : <document> },
      { deleteOne : <document> },
      { deleteMany : <document> }
   ]
)

db.collection.distinct()
常用写法:db.collection.distinct(fieldquery),如:
db.collection.distinct("name",{age:18})

db.collection.createIndex(),可视化工具更好用

db.collection.drop()删除一个集合

db.collection.dropIndex()
删除一个索引:db.collection.dropIndex("index01")

db.collection.explain() 可以对aggregate()、count()、find()、remove()、update()、distinct()、findAndModify()
如:db.collection.explain().find({...})

db.collection.findAndModify()
查询然后修改:
db.collection.findAndModify({
    query: <document>,
    update: <document or aggregation pipeline>, // Changed in MongoDB 4.2
    new: <boolean>,
    fields: <document>,
    upsert: <boolean>,
    bypassDocumentValidation: <boolean>,
    writeConcern: <document>,
    collation: <document>,
    arrayFilters: [ <filterdocument1>, ... ]
});

复杂查询:
$ne
 不等于
#查询age不等于25的文档
db.user.find({age:{$ne:25}})
$gt ---> 大于
db.user.find({age:{$gt:20}})
$gte --->  >=大于等于
db.user.find({age:{$gte:25}})
$lt --->  <=小于
db.user.find({age:{$lt:25}})
$lte --->  <=小于等于
db.user.find({age:{$lte:25}})
#$in -->  in
#查询age为20和25的文档
db.user.find({age:{$in:[20,25]}})
#$nin --> not in
#查询age不为20和25的文档
db.user.find({age:{$nin:[20,25]}})
#$or
语法: {$or:[v1,v2..]}
是指取出 field列是一个数组,且至少包含 v1,v2值
db.user.find({$or:[{age:{$gte:30}},{name:"Zhaos"}]})
#$and
语法: {$and:[{<operator-expression>},{<operator-expression>}..]}
是指取出 field列是一个数组,且至少包含 v1,v2值
db.user.find({$and:[{age:{$lte:30}},{age:{$gte:5}}]})
#$not
语法:{field:{$not:{ <operator-expression> }}}
是指取出 field列是一个数组,且至少包含 v1,v2值
db.user.find({age:{$not:{$gt:25}}})
#$all
语法: {field:{$all:[v1,v2..]}} 
是指取出 field列是一个数组,且至少包含 v1,v2值
db.user.find({age:{$all:[30]}})
$exists 
语法: {field:{$exists:1}}
作用: 查询出含有field字段的文档
#查询含有age列的文档
db.user.find({age:{$exists:1}})
$mod 
语法: {field:{$mod:[ divisor(除数), remainder(余数)]}}
作用: 查询出含有mod字段的文档
#查询含有age列的文档
db.user.find({_id:{$mod:[5,0]}})
$nor
{$nor,[条件1,条件2]}
是指所有条件都不满足的文档为真返回
#查询所有age不为30,gender不为f的文档
db.user.find({$nor:[{age:30},{gender:'f'}]})
正则表达式查询
#查询所有以name:yang开头的文档  /patern/
db.user.find({name:/yang*/})
#查询所有以name:zhao开头的文档,且不区分大小写  /patern/i
db.user.find({name:/zhao/i})
$where
#查询age>6,且age<22的文档
db.user.find({$where:"this.age>6" && "this.age<=22"})

索引命令

1 #增加索引:1 asc -1 desc

db.foo.ensureIndex({firstname:1,lastname:-1},{unieap:true})

2 #索引子对象(不懂)

db.foo.ensureIndex({'Al.Em':!})

3 #查看索引信息

db.foo.getIndexes()

db.foo.getIndexKeys()

4 #根据索引名删除索引(不懂)

db.foo.dropIndex('Al.Em_1')

管理命令

1 #查看collection数据大小

db.xingootest.dataSize()

2 #查看collection状态

db.xingootest.stats()

3 #查询所有索引的大小

db.xingootest.totalIndexSize()

索引设置及查询优化

MongoDB支持多种类型的索引:

针对字段有:单字段索引,也有复合索引(多字段索引)

索引类型:
哈希索引(Hashed Index)是指按照某个字段的hash值来建立索引,目前主要用于MongoDB Sharded Cluster的Hash分片,hash索引只能满足字段完全匹配的查询,不能满足范围查询等。

地理位置索引(Geospatial Index)能很好的解决O2O的应用场景,比如『查找附近的美食』、『查找某个区域内的车站』等。

文本索引(Text Index)能解决快速文本查找的需求,比如有一个博客文章集合,需要根据博客的内容来快速查找,则可以针对博客内容建立文本索引

MongoDB除了支持多种不同类型的索引,还能对索引定制一些特殊的属性。

  • 唯一索引 (unique index):保证索引对应的字段不会出现相同的值,比如_id索引就是唯一索引
  • TTL索引:可以针对某个时间字段,指定文档的过期时间(经过指定时间后过期 或 在某个时间点过期)
  • 部分索引 (partial index): 只针对符合某个特定条件的文档建立索引,3.2版本才支持该特性
  • 稀疏索引(sparse index): 只针对存在索引字段的文档建立索引,可看做是部分索引的一种特殊情况

db profiling

MongoDB支持对DB的请求进行profiling,目前支持3种级别的profiling。(类似于MySql的slow_query_log慢查询日志)

  • 0: 不开启profiling
  • 1: 将处理时间超过某个阈值(默认100ms)的请求都记录到DB下的system.profile集合 (类似于mysql、redis的slowlog)
  • 2: 将所有的请求都记录到DB下的system.profile集合(生产环境慎用)

通常,生产环境建议使用1级别的profiling,并根据自身需求配置合理的阈值,用于监测慢请求的情况,并及时的做索引优化。

分析器:

db.collection.explain()可以对aggregate()、count()、find()、remove()、update()、distinct()、findAndModify()进行语句分析,进而对执行的语句进行优化。该功能类似于MySql的explain

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值