【面试虐菜】—— MongoDB知识整理

为什么我们要使用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字符都可以使用

常用命令

1 #进入数据库

use admin

2 #增加或修改密码

db.addUser('xingoo','123')

db.addUser("xingoo","123",true) 参数分别为 用户名、密码、是否只读

3 #查看用户列表

db.system.users.find()

4 #用户认证

db.auth('xingoo','123')

5 #删除用户

db.removeUser('xingoo')

6 #查看所有用户

show users

7 #查看所有数据库

show dbs

8 #查看所有的collection集合

show collections

9 #查看各个collection的状态

db.printCollectionStats()

10 #查看主从复制状态

db.printReplicationInfo()

11 #修复数据库

db.repairDatabase()

12 #设置profiling,0:off 1:slow 2 all

db.setProfilingLevel(1)

13 #查看profiling

show profiling

14 #拷贝数据库

db.copyDatabase('xingootest','xingootest1')

db.copyDatabase("xingootest","temp","127.0.0.1")

15 #删除集合collection

db.xingootest.drop()

16 #删除当前数据库

db.dropDatabase()

MongoDB增删改命令

1 #存储嵌套的对象

db.foo.save({'name':xingoo,'age':25,'address':{'city':'changchun','Province':'Jilin'}})

2 #存储数组对象

db.foo.save({'name':xingoo,'age':25,'address':['Jilin Province','Liaoning Province']})

3 #根据query条件修改,如果不存在则插入,允许修改多条记录

db.foo.update({'age':'25'},{'$set':{'name':'xingoo'}},upsert=true,multi=true)

4 #删除yy=5的记录

db.foo.remove({'name':'xingoo'})

5 #删除所有的记录

db.foo.remove()

索引

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 $gt ---- >
 2 $lt ---- <
 3 $gte ---- >=
 4 $lte ---- <=
 5 $ne ---- != 、<>
 6 $in ---- in
 7 $nin ---- not in
 8 $all ---- all
 9 $or ---- or
10 $not ---- 反匹配

 

1 #查询所有记录

db.foo.find() ---- select * from foo

2 #查询某列非重复的记录

db.foo.distinct("xingoo") ---- select distinct name from foo

3 #查询age = 22 的记录

db.foo.find({"age":22}) ---- select * from foo where age = 22

4 #查询age > 22 的记录

db.foo.find({age:{$gt:22}}) ---- select * from foo where age > 22

5 #查询age < 22 的记录

db.foo.find({age:{$lt:22}}) ---- select * from foo where age < 22

6 #查询age <= 25的记录

db.foo.find({age:{$lte:25}})

7 #查询age >= 23 并且 age <=26的记录

db.foo.find({age:{gte:23,gte:23,lte:26}})

8 #查询name中包含xingoo的数据

db.foo.find({name:/xingoo/}) ---- select * from foo where name like '%xingoo%'

9 #查询name中以xingoo开头的数据

db.foo.find({name:/^xingoo/}) ---- select * from foo where name like 'xingoo%'

10 #查询指定列name、age的数据

db.foo.find({},{name:1,age:1}) ---- select name,age from foo

11 #查询制定列name、age数据,并且age > 22

db.foo.find({age:{$gt:22}},{name:1,age:1}) ---- select name,age from foo where age >22

12 #按照年龄排序

升序:db.foo.find().sort({age:1})  降序:db.foo.find().sort({age:-1})

13 #查询name=xingoo.age=25的数据

db.foo.find({name:'xingoo',age:22}) ---- select * from foo where name='xingoo' and age ='25'

14#查询前5条数据

db.foo.find().limit(5) ---- select top 5 * from foo

15 #查询10条以后的数据

db.foo.find().skip(10) ---- select * from foo where id not in (select top 10 * from foo);

16 #查询在5-10之间的数据

db.foo.find().limit(10).skip(5) 

17 #or与查询

db.foo.find({$or:[{age:22},{age:25}]}) ---- select * from foo where age=22 or age =25

18 #查询第一条数据

db.foo.findOne() 、db.foo.find().limit(1)---- select top 1 * from foo

19 #查询某个结果集的记录条数

db.foo.find({age:{$gte:25}}).count() ---- select count(*) from foo where age >= 20

20 #按照某列进行排序(不懂)

db.foo.find({sex:{$exists:true}}).count() ---- select count(sex) from foo

21 #查询age取模10等于0的数据

db.foo.find('this.age % 10 == 0')、db.foo.find({age:{$mod:[10,0]}})

22 #匹配所有

db.foo.find({age:{$all:[22,25]}})

23 #查询不匹配name=X*带头的记录

db.foo.find({name:{$not:/^X.*/}})

24 #排除返回age字段

db.foo.find({name:'xingoo'},{age:0})

25 #判断字段是否存在

db.foo.find({name:{$exists:true}})

管理

1 #查看collection数据大小

db.xingootest.dataSize()

2 #查看collection状态

db.xingootest.stats()

3 #查询所有索引的大小

db.xingootest.totalIndexSize()

参考资料:

【MongoDB介绍及安装】http://database.51cto.com/art/201103/247882.htm

【MongoDB使用入门】http://www.linuxidc.com/Linux/2013-01/78251.htm

本文转自博客园xingoo的博客,原文链接:【面试虐菜】—— MongoDB知识整理,如需转载请自行联系原博主。

时间: 2024-10-22 12:58:54

【面试虐菜】—— MongoDB知识整理的相关文章

【面试虐菜】—— Oracle知识整理《收获,不止Oracle》

普通堆表不足之处:     表更新有日志开销     表删除有瑕疵     表记录太大检索较慢     索引回表读开销很大     有序插入难有序读出 DELETE产生的undo最多,redo也最多,因为undo也需要redo保护 全局临时表: 1 高效删除记录 基于事务的全局临时表commit或者session连接退出后,自动删除 基于回话的全局临时表在退出回话后自动删除 2 针对不同的会话数据独立,不同的session访问全局临时表,看到的结果不同 全局临时表在程序的一次调用执行过程中,需要

【面试虐菜】—— Apache知识整理

Apache性能调优1 Apache 部分: 1. 移除不用的模块. 2. 使用 mod_disk_cache NOT mod_mem_cache . 3. 扁平架构配置mod_disk_cache. 4. 安装恰当的Expires, Etag, 和 Cache-Control Headers . 5. 将缓存放在独立的磁盘 6. 使用管道日志替代直接记录 7. 将日志放在不同的磁盘 8. 使用 mod_gzip/mod_deflate . 9. 将HostnameLookups关闭. 10.

【面试虐菜】—— JAVA面试题(1)

今天参加笔试,里面有设计模式,和一些基础题! 印象最深的是:什么不是Object的函数,我蒙的finalize,哎,无知! 还问了,接口与抽象类的不同,还有多线程的实现方式!下面基本都有. 另外还问了,观察者模式,设计模式,我一点不会,看来要下功夫了! 1.  面向对象编程的三大特性是什么,请简要阐述 (1).继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继 承了原始类的特性,新类称为原始类

【面试虐菜】—— 常用SQL语句

创建表 create table emp( id decimal, name char(10), age decimal) 删除表 DROP TABLE EMP 插入默认值 CREATE TABLE EMP( Id decimal NOT NULL, Name char(10) NOT NULL, Age decimal NOT NULL DEFAULT 18) 添加列 ALTER TABLE EMP ADD COLUMN Comments char(50) NOT NULL DEFAULT '

【面试虐菜】—— Oracle中CHAR、VARCHAR的区别

1.CHAR. CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充,所以在读取的时候可能要多次用到trim(). 2.VARCHAR. 存储变长数据,但存储效率没有CHAR高.如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的.VARCHAR类型的实际长度是它的值的实际长度+1.为什么"+1"呢?这一个

【面试虐菜】—— JAVA面试题(2)

1 String = 与 new 的不同 使用"="赋值不一定每次都创建一个新的字符串,而是从"字符串实例池"中查找字符串.使用"new"进行赋值,则每次都创建一个新的字符串. 2 String与StringBuffer String类是不可变类,字符串一旦初始化后,就不能被改变.而StringBuffer类是可变类,字符串值可以呗改变.常常在实际应用中看到累死这样的代码:String s=new("hello");s+=&q

【面试虐菜】—— JAVA面试题(3)

1 throws与throw的区别 解析:throws和throw是异常处理时两个常见的关键字,初级程序员常常容易正确理解throw和throws的作用和区别,说明已经能比较深入理解异常处理.Throw用来抛出异常,如果执行了throw语句,程序将发生异常,进入到异常处理机制.Throws用来声明异常,说明这个方法可能会发生某些类型的异常,那么编译器将强制在调用这个方法的时候处理异常.API中的很多方法都使用了throws声明了异常,所以使用这些方法时编译器会提示需要处理异常.   参考答案:t

asp知识整理笔记3(问答模式)_javascript技巧

继上两篇<asp知识整理笔记1>和<asp知识整理笔记2>,<asp知识整理笔记3>新鲜出炉: 17.问题:在ASP中使用ADO的AddNew方法和直接使用"Insert into..."语句有何不同?哪种方式更好?答:ADO的AddNew方法只是将"Insert into "语句封装了起来,所以,当对大量数据进行操作的时候,直接使用SQL语句将会大大加快存取数据的速度,因为它减少了ADO的"翻译"时间,由于S

asp知识整理笔记4(问答模式)_ASP基础

继前几篇篇<asp知识整理笔记1>和<asp知识整理笔记2>,<asp知识整理笔记3>新鲜出炉:23.问题:在ASP文件中读取HTML的表单字段有几种方法? 答:Request对象除了可以用来读取附带在网址后面的参数以外,也可以读取HTML表单字段的内容,经常使用的语法结构如下: < Form name =Formname method="Get|Post"Action="URL">< Form > 其中的