系统保留数据库

  1. admin
    从权限的角度看,这是root数据库。要讲一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务端指令也只能从这个服务器运行。
  2. local
    这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合。
  3. config
    当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。

增删查改

insert remove find update upsert

ObjectId

ObjectId是_id的默认类型。它设计成轻量型的,不同的机器都能用全局唯一的同种方法方便的生成它。 这是MongoDB采用ObjectId而不是常规(自增主键)的主要原因, 因为在多个服务器上同步自动增加主键值既费力又费时。MongoDB从一开始就被设计成分布式数据库,处理多个节点是一个核心要求。
ObjectId使用12字节的存储空间,每个字节两位16进制数字,是一个24位的字符串。这个ID是实际存储数据的两倍长。
如果连续创建多个ObjectId,会发现只有最后几位数字有变化,另外中间的几位数组也会有变化。创建方式如下:

0 1 2 3 | 4 5 6 | 7 8  | 9 10 11
时间戳   |  机器  |  PID |  计数器

时间戳,与随后的五个字节组合起来,提供了秒级别的唯一性。

由于时间戳在前,这意味着ObjectId**大致**会按照插入的顺序排列,这对于某些方面很有用,如将其作为索引提高效率。

这四个字节也隐含了文档创建的时间。绝大多数驱动都会gong开一个方法从ObjectId获取这个信息。

前9字节保证了同一秒钟 不同机器 不同进程产生的ObjectId是唯一的。

自动生成_id

虽然ObjectId设计成轻量型的,易于生成,但是毕竟生成的时候还是产生开销。在客户端生成体现了MongoDB的设计理念。能从服务器端转移到驱动程序来做的事,就尽量转移。

$

用set可以修改键的数据类型。用“$unser”:“keyname”:1删除键用inc来增加已有键的值或者在键不存在时创建一个键
…待续

避免使用skip略过大量结果

1.分页

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

db.foo.find().sort("":-1).limit()
db.foo.find("":{$gt:""}).limit

2.随机选择文档

db.people.insert({"random":Math.random()})

var random = Math.random()
result = db.foo.fndOne({"random":{"$gt/lt"  : random}})

索引

创建索引的缺点就是每次插入更新和删除时都会产生额外的开销,这是因为数据库不但需要执行这些操作还要将这些操作在集合的索引中标记。因此,要尽可能少创建索引。

认证

>
use admin
db.addUser("root", "abcd")
use test
db.addUser("test_user", "test_user", true) #第三个参数readOnly=?

#bin/bash
./mongo --auth

>
use test
db.auth("", "")

数据库的用户账号是以文档的形式存储在system.users集合里面。文档的结构是

{
    "user" : username,
    "readOnly" : true,
    "pwd" : password hash
}

password hash 是根据用户名和密码生成的散列。