MongoDB学习笔记03-MongoDB 数据库,对象,集合
本文源自本人原博MongoDB 数据库,对象,集合 - CSDN博客
数据库
一组集合就可以组成一个数据库。一个MongoDB实例可以承载多个数据库。每个数据库都有独立的权限控制。"show dbs"
命令可以显示所有数据的列表。
C:\Users\bin>mongo
MongoDB shell version: 3.0.2
connecting to: test
> show dbs
admin 0.078GB
db 0.078GB
local 0.078GB
test 0.078GB
>
执行 "db"
命令可以显示当前数据库对象或集合。
> db
test
运行"use"
命令,可以连接到一个指定的数据库。
> use local
switched to db local
注意:
- 数据库名称可以是任何字符,但是不能包含空字符串,点号(.),或者" "。
- "system" 作为系统保留字符串不能作为数据库名。
- 数据库名不能包含 "$"。
文档
文档是mongodb
中的最核心的概念,是其核心单元,我们可以将文档类比成关系型数据库中的每一行
数据。
多个键及其关联的值有序的放置在一起就是文档。在mongodb
中使用一种类json
的bson
存储数据。MongoDB
中对文档的区分包括:键值对的顺序
,键和值的类型
,键和值的大小写
。在两个文档中如果这三者有任何一个不一致,这两个文档就不相同。文档中键值对的“值”的数据类型甚至还可以是整个嵌入的文档,“键”则只能是字符串
。
新增文档(集合会自动创建)
> db.mycoll.insert({"name":"zhang"})
WriteResult({ "nInserted" : 1 })
> db.mycoll.remove({"name":"zhang"})
WriteResult({
"nRemoved" : 0,
"writeError" : {
"code" : 20,
"errmsg" : "cannot remove from a capped collection: test.mycoll"
}
})
>
插入文档你也可以使用 db.mycoll.save(document)
命令。如果不指定 _id
字段 save()
方法类似于 insert()
方法。如果指定 _id
字段,则会更新该 _id
的数据。
文档例子如下:
{ name : "zhang" }
- 通常,"
object
(对象)" 术语是指一个文件。 - 文件类似于一个
RDBMS
的记录(行)。 - 我们可以对集合(
collection
)进行插入,更新和删除操作。
下表将帮助您更容易理解Mongo中的一些概念:
RDBMS | MongoDB |
---|---|
Table(表) | Collection(集合) |
Column(栏) | Key(键) |
Value(值) | Value(值) |
Records / Rows(记录/列) | Document / Object(文档/对象) |
数据类型
下表为 MongoDB
中常用的几种数据类型。
数据类型 | 描述 |
---|---|
String(字符串) | 存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 |
Integer(整型) | 用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。 |
Boolean(布尔型) | 逻辑值 True 或者 False。 |
Double(双精度浮点值) | 用于存储浮点值。 |
Min/Max keys | 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。 |
Null | 用于创建空值。 |
Array | 用于将数组或列表或多个值存储为一个键。{"arr": ["a","b"]} |
Object | 用于内嵌文档。 |
Timestamp | 时间戳。记录文档修改或添加的具体时间。 |
Symbol | 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。 |
Object IDs | 在mongodb中的文档需要使用唯一的关键字_id来标识他们。几乎每一个mongodb文档都使用_id字段作为第一个属性(在系统集合和定容量集合(capped collection)中有一些例外)。_id值可以是任何类型,最常见的做法是使用ObjectId类型。 |
Date | 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。 |
Binary Data | 二进制数据。用于存储二进制数据。shell不支持 |
Code | 代码类型。用于在文档中存储 JavaScript 代码。{"x":function() {}} |
Regular expression | 正则表达式类型。用于存储正则表达式。遵循JavaScript的语法 |
内嵌文档 | 文档可以作为文档中某个key的value {"x":{"foo":"bar"}} |
Undefined | 未定义 {"x":undefined} |
上面的大部分类型都是显而易见的,但是有必要详细解释一下对象id类型。我们上面说了,对象id类型是一个12字节的唯一id。每个字节2位16进制数,因此整个id类型是一个24位的字符串。其结构如下表所示:
- 前面四个字节代表从标准纪元开始的时间戳,以秒为单位。
- 接下来三个字节表示机器号,一般是机器名的hash值。这可以保证不同机器产生的id不会冲突。
- 接下来两个字节表示进程id号,保证统一机器不同建成产生的id不冲突
- 最后三个是计数器的计数值,对于任意一秒钟,可以产生2^24个数
如果不在插入的时候手动的添加_id键,那么系统会自动添加一个。尽管MongoDB的id类型被设计成轻量级的,但是这样还是会不好。毕竟服务器创建这个还是会有开销的。因此,这个工作一般会放到客户端来做。
集合
集合就是一组文档的组合。如果将文档类比成数据库中的行,那么集合就可以类比成数据库的表。
在 mongodb
中的集合是无模式的,也就是说集合中存储的文档的结构可以是不同的,比如下面的两个文档可以同时存入到一个集合中:
{"name":"zhang"} {"Name":"zhang","sex":"nan"}
当第一个文档插入时,集合就会被创建。
capped collections
Capped collections
就是固定大小的collection
。
它有很高的性能以及队列过期的特性(过期按照插入的顺序). 有点和 "RRD" 概念类似。
Capped collections
是高性能自动的维护对象的插入顺序。它非常适合类似记录日志的功能 和标准的collection
不同,你必须要显式的创建一个capped collection
, 指定一个collection
的大小,单位是字节。collection
的数据存储空间值提前分配的。
要注意的是指定的存储大小包含了数据库的头信息。
> db.createCollection("myCappedColl", {capped:true, size:100000})
{ "ok" : 1 }
>
还有一个参数 autoIndexID
,值可以为 true
和 false
来决定是否需要在 _id
字段上自动创建索引,如:
db.createCollection("myCappedColl", {size:10000000, autoIndexId:false})
还可以指定文档个数,加上 max
:1000属性:
db.createCollection("myCappedColl",{capped:true,size:10000,max:1000})
判断集合是否为固定集合:
db.myCappedColl.isCapped()
true
如果需要将已存在的集合转换为固定集合
可以使用以下命令:
>db.runCommand({"convertToCapped":"myColl",size:10000})
{ "ok" : 1 }
>db.myColl.isCapped()
true
查看一个 collection
已经使用了多少空间
> db.user.validate();
{
"ns" : "db_mongo.user",
"capped" : true,
"max" : NumberLong("9223372036854775807"),
"datasize" : 1680,
"nrecords" : 14,
"lastExtentSize" : 12288,
"firstExtent" : "0:126000 ns:db_mongo.tmp.convertToCapped.user",
"lastExtent" : "0:126000 ns:db_mongo.tmp.convertToCapped.user",
"extentCount" : 1,
"firstExtentDetails" : {
"loc" : "0:126000",
"xnext" : "null",
"xprev" : "null",
"nsdiag" : "db_mongo.tmp.convertToCapped.user",
"size" : 12288,
"firstRecord" : "0:1260b0",
"lastRecord" : "0:126798"
},
"deletedCount" : 1,
"deletedSize" : 10208,
"nIndexes" : 1,
"keysPerIndex" : {
"db_mongo.user.$_id_" : 14
},
"valid" : true,
"errors" : [ ],
"warning" : "Some checks omitted for speed. use {full:true} option to do
more thorough scan.",
"ok" : 1
}
固定集合文档按照插入顺序储存的,默认情况下查询就是按照插入顺序返回的,也可以使用$natural
调整返回顺序。
>db.user.find().sort({$natural:-1})
查看collection
最大存储大小,已经使用了多少空间等信息
>db.user.stats()
{
"ns" : "db_mongo.user",
"count" : 15,
"size" : 1712,
"avgObjSize" : 114,
"numExtents" : 1,
"storageSize" : 12288,
"lastExtentSize" : 12288,
"paddingFactor" : 1,
"paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0.
It remains hard coded to 1.0 for compatibility only.",
"userFlags" : 1,
"capped" : true,
"max" : NumberLong("9223372036854775807"),
"maxSize" : 12288,
"nindexes" : 1,
"totalIndexSize" : 8176,
"indexSizes" : {
"_id_" : 8176
},
"ok" : 1
}
- 可以插入及更新,但更新不能超出
collection
的大小,否则更新失败。 - 不允许删除单行,但是可以调用
drop()
删除集合中的所有行,但是drop
后需要显式地重建集合。 - 在 32 位机上,一 个
capped collection
的最大值约为482.5M
,64 位上只受系统文件大小的限制。 - 如果超出大小限制,再添加会将前面添加的数据替换掉。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 bin07280@qq.com
文章标题:MongoDB学习笔记03-MongoDB 数据库,对象,集合
文章字数:2.2k
本文作者:Bin
发布时间:2017-07-17, 14:41:38
最后更新:2019-08-06, 00:07:35
原始链接:http://coolview.github.io/2017/07/17/MongoDB/MongoDB%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B003-MongoDB%20%E6%95%B0%E6%8D%AE%E5%BA%93%EF%BC%8C%E5%AF%B9%E8%B1%A1%EF%BC%8C%E9%9B%86%E5%90%88/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。