面试题各个击破----Mongodb

发布于 / 随记 / 0条评论 / Tags: linux / 13 次浏览

-----------------概述-----------------------
1.mongodb 使用了文档,而不是行,没有了schema的约束,支持更多类型,修改更方便,传统mysql修改schema,尤其是数据比较多的时候很痛苦
2.mongodb不支持join操作,因为这个在分布式中效率不高
3.mongodb支持time-to-live类型的collections,可以很好的用来存储session
4.mongodb会为文档之间预留空间padding,来对修改文档提供稳定的性能,否则要删除重建。
5.mongodb设计初衷为不牺牲性能,所以一些传统数据库的特性支持的不好,需要客户端自己处理
-----------------概念-----------------------
1.document 类似于RDB的行,但是更具表现力
2.collection类似于RDB的table,但是schema是动态的dynamic
3.一个mongoDb实例可以包含多个独立的数据库databases,每个database有自己的collection
4.每个document都有一个特殊的key,"_id"在一个collection中他是唯一的
5.Mongodb有一个shell,用javascript语言管理数据库
--------------------------基础知识----------------------
1.Document ---一组set有序的key和他关联的值组成的集合。

  • 每个变成语言都有这种数据结构,如map,hash,dictionary,javascript中表示为对象。
{"greeting" : "Hello, world!"}
  • 文档的值可以是一个基础类型,也可以是一个内嵌文档
  • key只能是一个UTF8的字符串,和C语言一样,\0结尾,所以不能包含\0。点和$都是保留字符
  • mongodb是一个类型敏感的,大小写页面干,3和"3"是不同的类型
  • key是不可以重复的。并且key是有序的。不同的顺序表示不同的文档,如下。但是同常,顺序不重要,这两个文档在实际使用中作用是一样的,好多语言对文档类型map本身没有顺序要求。
{"x" : 1, "y" : 2}
{"y" : 2, "x" : 1}

2.collections
3.dynamic schemas

  • 同一个collection可以有不同schema的文档
{"greeting" : "Hello, world!"}
{"foo" : 5}
  • 但是collection还是必要的,数据类型可以不同,但是总归还是同一类数据,并且速度上,分开查询更快,索引同一个字段。

3.naming---------collection有一个utf8的名字

  • ”“不允许
  • 不能包含\0
  • 不能以system开头,这个系统的保留前缀
  • 不能有$

4.子集合blog.authors blogs.posts,用点分开

  • 子集合和所谓的父(这里是blog)并没有关系,只是名义上的组织关系
  • 但是子集合在GFS和语法糖上有用处,比如db.blog.posts db.blog,让他们用起来更有逻辑性
    5.databases
  • 名字不能包含"",/, \, ., " , *, <, >, :, |, ?, $, (,\0 。基本上只能用ASCII定义的字符和数字
  • 名字大小写是敏感的,最长64bytes
  • 数据库名---这么多限制是因为,最终一个数据库名最终会变成文件名的一部分
  • 预留数据库名字 admin----root数据库,一个用户添加到这个数据库,就与偶所有数据库的权限。还有一些名列---如列出所有数据库,关闭服务器,只能在这个库运行
  • 预留数据库名字local----这个数据库没有副本,智慧保留本地
  • 预留数据库名字config----这里用来保存shard信息
    6.mongo shell ----直接命令行mongo即可打开
    7.mongo client
  • mongoshell 真正的威力是他本身是一个独立的mongo client ,启动的时候建立连接,并将链接赋值给全局变量db
  • mongo shell 提供了一些非js的扩展语法糖

    use footbardb #选择使用数据库,
    db #显示当前db
    

    8.基础操作

  • create

    post = {"title" : "My Blog Post",
    ... "content" : "Here's my blog post.",
    ... "date" : new Date()}
    {
    "title" : "My Blog Post",
    "content" : "Here's my blog post."
    }
    db.blog.insert(post)
    db.blog.find()
    {
    "_id" : ObjectId("5037ee4a1084eb3ffeef7228"),
    "title" : "My Blog Post",
    "content" : "Here's my blog post.",
    "date" : ISODate("2012-08-24T21:12:09.982Z")
    }
  • read ---

    db.post.findOne()
  • update (限定条件,新的文档),只会更新新文档中的字段

    db.blog.update({title : "My Blog Post"}, post)
  • remove(限定条件)
    9.类型
  • 类似json,但是json仅有6种类型 null, boolean, numeric, string, array, object。不支持日期类型,数字类型无法区分浮点数和整数。无法表示long类型,还有通用类型:正则---函数等
  • mongodb保持json的基础上,增加了其他类型。
  • null 表示空值,或者不存在的字段
  • boolean ---true ,false
  • number ---默认64位浮点数,还有numberInt,numberLong类

    {"x" : 3.14}
    {"x" : NumberInt("3")}
    {"x" : NumberLong("3")}
  • string

    {"x" : "foobar"}
  • date 日期被存储为新纪元以来的毫秒数.注意Date返回的是日期的字符串,new Date才是返回Date对象

    {"x" : new Date()}
  • regular expression正则表达式类型,使用与查询条件

    {"x" : /foobar/i}
  • array ----数据列表,注意数组中可以包含不同类型。而且可以在数组上创建索引,从而优化数组中的查询速度

    {"x" : ["a", "b", 3]}
  • 内嵌文档embedded document,内嵌文档,同样可以创建索引,如果你想根据内嵌文档的key搜索这个文档

    {"x" : {"foo" : "bar"}}
  • object id---12 byte的id,12个bytes,显示成24个16进制数,包含时间信息(可以获取).由客户端的driver生成。

    {"x" : ObjectId()}
  • 1 2 3 Timestamp
  • 5 6 Machine
    7 8 PID
    9 10 11 Increment

  • binary data ----任意字节的字符串,不能直接在shell中使用
  • code 查询中,或者文档中可以包含代码

    {"x" : function() { /* ... */ }}

    10.

    评论区(暂无评论)