mongodb简单学习

MongoDB的内部构造 From 《MongoDB The Definitive Guide》
http://www.cnblogs.com/gpcuster/archive/2010/10/04/1841877.html
MongoDB——通过客户端理解mongoDB体系结构
http://blog.csdn.net/liusong0605/article/details/10611895
MongoDB内存使用原理
http://www.searchdatabase.com.cn/showcontent_51990.htm


  1. 日期:mongodb的日期不包含时区。日期对象 new Date(),日期字符串 Date(…)

  2. json仅包含6中数据类型:(null,布尔,数字,字符串,数组,对象)
    局限:

    1)没有日期类型
    2)只有一种数字类型,无法区分浮点数和整数,更别说区分32位和64位数字
    3)不能表示其他通用类型,比如,正则表达式
    
  3. BSON:

    1)由mongoDB生态系统里所有驱动程序、工具、进程共享的文档
    2)是一种轻量的二进制格式,可用一串字节来描述任何mongodb文档,是文档存放于磁盘上的格式
    3)驱动程序在使用文档进行增删改查等操作时,会先将文档编码成BSON格式,然后发送给服务器。服务器将文档返回给客户端时,也是以BSON格式进行的,驱动程序会先对此BSON数据进行解码,然后再发送给客户端
    4)优点:

    高效:
    可遍历性:以空间效率为代价,使自身更容易遍历;例如,字符串值会被加上一个前缀用以表示长度,而不是依赖于终止符号来
                       判断字符的结尾
    高性能:可快速进行编码和解码,因为它使用类C类型表示,这在大部分语言中可快速运行
    

4、ObjectId的12字节按照如下方式生成:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11
时间戳(s) | 机器(hash) | PID | 计数器
ObjectId,是由12字节,每个字节是2位十六进制数字,总共是一个24位的字符串。
其中0-3字节是时间戳(单位秒),4-6字节是主机名散列值,7-8字节是PID(进程标识符,确保每个进程的ObjectId不同),9-11字节是计数器(确保同一进程的同一秒产生的ObjectId不同,最大值256的3次方)。
_id可以由Mongodb服务器来完成,但是一般会在客户端由驱动程序完成,因为在客户端完成可以减少服务器的开销,将事务交给客户端来做,就减轻了数据库扩展的负担。并且在客户端生产的ObjectId,驱动程序能提供更加丰富的,由自己扩展的API。

5、用户主目录

6、插入校验:
1)检查文档大小:所有文档都必须小于16M(防止不良的模式设计,保证性能一致)
2)检查_id字段

7、常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
use new-databasename 定义新的数据库名
   即使你的数据库还没建立起来,依然可以这样使用,因为mongodb会在真正插入了数据后,才会真正建立起来
mongod :启动mongodb服务器
同时会启动一个基本的http服务器,监听28017端口,通过访问http://localhost:28017可以获取数据库管理信息
参数:
1、some-host:port/db :可以连接到其他实例
mongo:启动shell ,
--nodb 启动shell不连接任何数据库,在需要连接时用 new Mongo("some-host:port")
eg: >conn = n new Mongo("some-host:port")
connection to some-host:port
>db = conn.getDB("myDb")
myDb
help:查看Mongodb特有shell功能帮助(mongo是一个简化的javascript shell)
db.help():查看数据库级别的帮助
db.foo.help():查看集合级别的帮助
查看函数帮助(javascript实现代码),直接在shell中输入函数名
load(“XXXXXX.js”):运行脚本(在脚本中可以使用db变量及其他全局变量,但shell辅助函数不可以使用在脚本中(如,use db、show dbs))
run():执行命令行程序(局限性,不支持管道)
batchInsert([{"":""},{"":""},{"":""}])
db.foo.insert();//插入
db.foo.remove();//删除
db.foo.update();//更新
db.foo.update({"serch":"查询文档"},{"$set":{"modifier":"增加或者更新修改器文档(不存在就创建)"}});
db.foo.update({"serch":"查询文档"},{"$unset":{"modifier":"删除修改器文档"}});
db.foo.update({"serch":"查询文档"},{"$inc":{"modifier":"增加或减少已有键的值(不存在就创建)"}});//负数表示减少;必须是数字,null、布尔型都不行,只能用于整型、长整型或双精度浮点型的值
//数组修改器
db.foo.update({"serch":"查询文档"},{"$push":{"modifier":"增加或者更新数组修改器文档(不存在就创建)"}});//添加一个元素
db.foo.update({"serch":"查询文档"},{"$push":{"modifier":{"$each",[1,2,3,"增加或者更新数组修改器文档(不存在就创建)"]}}});//添加多个元素
//eg:
db.foo.update({"_id":3},{"$push":{"name":{"$each",[{"title":"mahui","number":1},{"title":"mahui","number":2},{"title":"mahui","number":3}]}},"$slice":-10,"$sort":{"number":-1}});//添加多个元素,限制数组长度为10,这样会插入超过的数组的最后10个元素
db.foo.update({"_id":3},{"$addToSet":{"name":{"title":"mahui","number":1}}});//为数组中添加非重复数据一个
db.foo.update({"_id":3},{"$addToSet":{"name":{"$each":[{"title":"mahui","number":1}]}}});//为数组中添加非重复数据一个
db.photos.update({"name":{"$ne":{"title":"mahui","number":1}}},{"$push":{"name":{"title":"mahui","number":1}}});//为数组中添加非重复数据(每个文档的name数据类型需保持一致)
db.photos.update({"_id":3},{"$pop":{"name":1}});//删除一个数据,1从尾部删除,-1从头部删除
db.photos.update({"_id":3},{"$pull":{"name":{ "title" : "mahui", "number" : 5 }}});//删除所有匹配的数据
db.photos.update({"_id":3},{"$set":{"name.0.title":"jinglinger"}});
db.photos.update({"name.title":"jinglinger"},{"$set":{"name.$.title":"huangshang"}});