MongoDB学习笔记03-MongoDB 数据库,对象,集合

  1. 数据库
  2. 文档
  3. 数据类型
  4. 集合
  5. capped collections

本文源自本人原博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

注意:

  1. 数据库名称可以是任何字符,但是不能包含空字符串,点号(.),或者" "。
  2. "system" 作为系统保留字符串不能作为数据库名。
  3. 数据库名不能包含 "$"。

文档

文档是mongodb中的最核心的概念,是其核心单元,我们可以将文档类比成关系型数据库中的每一数据。
多个键及其关联的值有序的放置在一起就是文档。在mongodb中使用一种类jsonbson存储数据。
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,值可以为 truefalse 来决定是否需要在 _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" 转载请保留原文链接及作者。

目录