mongodb 基础知识

mongodb概念类比sql概念
文档document,拥有唯一的键值”_id”复杂的行
集合collection没有模式的表
单个实例 - 容纳多个独立的数据库

文档document

文档:多个 键key 及其关联的 值value 有序地 放置在一起。
在各种编程语言中表现不同:python字典ruby散列Go等的映射

{“key” : value}
  • 文档中的 键值(k-v) 是有顺序的。
    {"k1":v1,"k2":v2}不同于 {"k2":v2,"k1":v1}
  • 值v 可以是多种数据类型:字符串数值 或者另一个 文档 等。
  • 键k 是字符串。utf-8字符。
  • 键值(k-v) 是区分 键大小写值类型 的。
  • 键k 不能重复。

键的命名

满足下述条件的任意 utf-8 字符串。

  • 不能含有结尾符 \0
  • 不能含有保留字符 .$
  • 不能以 _ 开头。(键是被保留的)

集合collection

集合:文档的集合。类似没有模式的表。

无模式

值可不同,键也可不同。

{“greeting” : "hello",
 "foo" : 3}

为什么使用多个集合?

  • 查询简易度查询速度 会提升。
  • 把同类型的文档放在一起,这样数据会更加集中。
  • 创建索引时,文档会有附加的结构。索引更有效。

命名

满足下述条件的任意 utf-8 字符串。

  • 不能是空字符串 ""
  • 不能含有结尾符 \0
  • 不能含有保留字符 $
  • 不能以 system. 开头。

子集合

使用 "." 分开的按命名空间划分的子集合,更好的组织数据。如,

blog.posts
blog.authors

数据库 database

数据库:集合的集合。

命名

满足下述条件的任意 utf-8 字符串。

  • 不能是空字符串 ""
  • 不能含有结尾符 \0
  • 不能含有 单引号''空 格点.钱$正反斜杠 / \
  • 全部 小写
  • 最多 64 字节。
  • 不能是保留名:adminlocalconfig

因为数据库名最终会变成文件系统里的文件,所以限制较多。

命名空间

  • 命名空间:database_name.collection_name 组成命名空间。
  • 命名空间长度 <= 121 字节。实际中应 <= 100 字节。

mongodb shell

mongo.exe ,一个自带的 javascript shell 。从命令行和mongodb交互。

在运行shell mongo.exe 前,请确保启动数据库服务器 mongod.exe

选择数据库

use foobar // db = foobar

查看数据库

db

1. 增 / 创建文档

db.collection_name.insert(new_doucment)

2. 增 / 增加键值

db.collection_name.update(限定条件_如_{"title":"foo"}, new_key_value)

3. 删 / 删除

db.collection_name.remove(限定条件_如_{"title":"foo"})

4. 查 / 读取

db.collection_name.find()      // 返回集合里所有的文档
db.collection_name.findOne()   // 返回一个文档

帮助 help

shell中键入 help 获得帮助

help
db.help()                       // 数据库相关的帮助
db.collection_name.help()       // 集合相关的帮助
function_name                   // 函数不加括号,显示该函数的js代码

db.集合名

db.name

  1. 当js只有在db中找到同名属性时,会将其作为方法而非集合名。如,db.version
  2. 当集合名包含运算符时,如 db.foo-bar 。会做减法运算而报错。

解决方法,使用getCollection方法:

db.getCollection("collection_name")
db.getCollection("version")
db.getCollection("foo-bar")

变量访问子集合

在js中 x.y = x['y'] ,也就是说,

db.collection_name.sub_name = db.collection_name[sub_name]

可以如下优雅的书写,

var sub_collections = ["foo", "bar", "zzz"];
for (i in collections) {
    doStuff(db.collection_name[sub_collections]);
}

而不用如此笨拙,

doStuff(db.collection_name.foo);
doStuff(db.collection_name.bar);
doStuff(db.collection_name.zzz);

数据类型

下面介绍shell中支持哪些mongodb的数据类型的显示。

数据类型描述示例
null空值{“x” : null}
booltrue or false{“x” : true}
i32shell不支持会被转换为64bit float
i64shell不支持会被转换为64bit float
f64shell中数字都是此类型{“x” : 3.14}
上述的整数也是此类型{“x” : 3}
string字符串,utf-8{“x” : “foobar”}
ObjectId文档的 12字节 唯一ID{“x” : ObjectId()}
date日期,从标准纪年的毫秒数{“x” : new Date()}
re正则表达式,采用js语法{“x” : /foobar/i}
codejs代码{“x” : function() {/* … */}}
符号shell不支持shell将db中的符号转化为字符串
二进制数据shell不支持
最大值shell不支持
最小值shell不支持
undefinedjs中null和undefined是不用类型{“x” : underfined}
array[]值和列表的集合{“x” : [“a”, “b”, “c”]}
内嵌文档{}文档包含文档{“x” : {“y”: “bar”}}

数字

因为js只有1种数字类型(f64),而mongodb有3种(i32,i64,f64)。如果数据库中的数字是i32,在shell中修改后,传回db的数将变成f64。所以

不要在shell下覆盖整个文档。

日期

  • new Date() 返回的是从标准纪年的毫秒数。
  • 而单调用构造函数 Date() 则返回的是字符串。

注意,Date函数首字母是大写。

数组

数组可以作为有序对象操作(像列表,栈,队列),也可以作为无序对象操作(如集合)。能用内容对数组进行查询和构建索引。

文档

文档可以内嵌文档。

_id

  • 文档必须 只有 一个”_id”的键。这个键可以是任意类型,但默认是ObjectId对象。
  • 2个集合可以有一个相同”_id”键。

ObjectId 使用12字节存储空间。其结构如下:

0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11
timestamp     | machine   | PID   | counter 

尽量在客户端生成 ObjectId

设计理念

能从 服务器端 转移到 客户端驱动程序 来做的事就尽量转移。扩展 应用层 比扩展 数据库 容易的多。

参考

《mongodb权威指南》

彩蛋

祝大家戊戌狗年旺旺旺!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值