Mongodb基础知识条记_玖富娱乐主管发布


玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。

MongoDB引见

MongoDB是一个基于分布式文件存储的开源文档数据库。由C 言语编写。旨在为WEB运用供应高机能、高可用性和高伸缩数据存储解决方案。

MongoDB长处

MongoDB运用场景

  • 数据缓存

    由于机能很高,MongoDB合适作为信息基础设施的缓存层。在体系重启以后,由MongoDB搭建的耐久化缓存层可以或许制止基层的数据源过载。

  • 工具和json存储

    MongoDB的BSON(二进制JSON)数据花样非常合适文档化花样的存储及查询,而且JSON花样存储最接近实在工具模子,对开辟者友爱,轻易疾速开辟迭代,天真的形式让你不在为了赓续转变的需求而去频仍修正数据库字段和构造。

  • 高伸缩性场景

    MongoDB经由过程分片集群,使MongoDB效劳才能易于程度扩大。

  • 弱事件范例营业

    MongoDB不支撑多文档事件,所以像银行体系这类须要大批原子性庞杂事件的顺序不合适运用MongoDB。(注:MongoDB 4.0将支撑跨文档的事件)

MongoDB观点

经由过程和干系型数据库mysql的对照,让我们更轻易的明白MongoDB的一些观点

干系型数据库(sql)观点 MongoDB观点 申明
database database 数据库
table collection 数据库表/鸠合
row document 数据行/文档
column filed 数据字段/域
index index 索引

数据库

  • 一个MongoDB中可以或许竖立多个数据库。

  • MongoDB的默许数据库为"db",该数据库存储在data目次中

鸠合

  • 鸠合名不克不及以"system."开首

  • 干系型数据库中的表(table)中的每一条数据(row)的花样是事前约定好的的,而MongoDB中的鸠合(collection)中文档(document)的数据花样是不流动的,也就是说我们可以或许将以下数据插进去一致文档中。

{"site":"www.wuhuan.me"}
{"site":"www.baidu.com","name":"百度"}

文档

  • 文档中的值不只可以或许是在双引号内里的字符串,还可以或许是其他几种数据范例(以至可以或许是悉数嵌入的文档)

比方:在干系型数据库中有一张students表和course表,表的构造和数据以下:

students表

id name sex age
1 李雷 0 12
2 韩梅梅 1 12

course表

id course_id course_name score user_id
1 1 语文 99 1
2 2 数学 100 1
3 1 语文 96 2
4 2 数学 98 3

以上数据和构造在MongoDB中可以或许运用内嵌文档来透露表现(一对多)的干系:

{
  "_id":ObjectId("5349b4ddd2781d08c09890f3"),
  "name":"李雷",
  "sex":"0",
  "age":"12",
  "course":[{
    "course_id":1,
    "course_name":"语文",
    "score":99,
  },{
    "course_id":2,
    "course_name":"数学",
    "score":100,
  }]
}
{
  "_id":ObjectId("5349b4ddd2781d08c09890f4"),
  "name":"韩梅梅",
  "sex":"1",
  "age":"12",
  "course":[{
    "course_id":1,
    "course_name":"语文",
    "score":96,
  },{
    "course_id":2,
    "course_name":"数学",
    "score":98,
  }]
}
  • 文档中的键/值对是有序的,文档中的键是不克不及反复,且辨别大小写。

数据范例

数据范例 形貌
String 字符串。存储数据经常使用的数据范例。在 MongoDB 中,UTF-8 编码的字符串才是正当的。
Integer 整型数值。用于存储数值。依据你所接纳的效劳器,可分为 32 位或 64 位。
Boolean 布尔值。用于存储布尔值(真/假)。
Double 双精度浮点值。用于存储浮点值。
Min/Max keys 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对照。
Array 用于将数组或列表或多个值存储为一个键。
Timestamp 时刻戳。纪录文档修正或增添的详细时刻。
Object 用于内嵌文档。
Null 用于建立空值。
Symbol 标记。该数据范例基础上等同于字符串范例,但分歧的是,它一样平常用于接纳特殊标记范例的言语。
Date 日期时刻。用 UNIX 时刻花样来存储以后日期或时刻。你可以或许指定本身的日期时刻:建立 Date 工具,传入年月日信息。
Object ID 工具 ID。用于建立文档的 ID。
Binary Data 二进制数据。用于存储二进制数据。
Code 代码范例。用于在文档中存储 JavaScript 代码。
Regular expression 正则表达式范例。用于存储正则表达式。

ObjectId

MongoDB文档必须有一个默许的**_id键,且在一个鸠合里_id一直独一。_id**键的值可以或许是任何范例的,默许是个ObjectId工具,它由MongoDB数据库自动建立。MongoDB运用objectId而不是运用通例做法(自增主键)重要原因是,在多个效劳器(分布式)同步自动增添主键辛苦费时。

ObjectId由12个字节的BSON构成

  • 前4个字节透露表现时刻戳

  • 接下来的3个字节是机械标识码

  • 紧接的两个字节由历程id构成(PID)

  • 末了三个字节是随机数。

建立新的ObjectId

我们可以或许在敕令行经由过程以下语句来建立一个新的ObjectId

> newId=ObjectId()

上面语句将返回一个独一的_id

ObjectId("1249b4ddd2712d08c09890f3")

也可以或许运用天生的ObjectId替代MongoDB自动天生的ObjectId。

MongoDB基础运用

装置数据库

在windows装置MongoDB比较简单在官网MongoDB下载地点下载对应的windows装置包一键装置就好了。

装置完以后记得将MongoDB装置目次下的bin目次加入到体系的环境变量中。

启动数据库

启动数据库运用mongod敕令

  • 体式格局一:一般体式格局启动
> mongod --dbpath  E:MongoDBdatadb  #不运用默许端口的话可以或许加上--port=[端口号]参数

E:datadb为数据文件途径

  • 体式格局二:经由过程配置文件启动
> mongod --config E:MongoDBmongo.conf

E:MongoDBmongo.conf为配置文件途径,配置文件内容为:

# 效劳端口
port=27017
# 数据文件途径
dbpath=E:mongondbdatadb 
# 日记文件途径
logpath=E:mongondblogmongon.log
# 翻开日记输出操纵
logappend=true
# 不运用任何的考证体式格局登录
noauth=true

衔接数据库

衔接数据库运用mongo [,链接字符串]衔接url的规范语法以下

mongodb://[username:password@]host[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
  • 登录当地默许数据库效劳器,无用户名暗码,端口默许27017,链接默许的db数据库
> mongo mongodb://localhost/db 

或许

> mongo 
  • 运用用户名admin、暗码123456,登录当地端口为27017的test数据库。
> mongo mongodb://admin:123456@localhost:27017/test

建立数据库

建立数据库运用use [数据库名],比方建立一个test123的数据库

> use test123
switched to db test123
> db
test123

显现以后一切的数据库可以或许运用敕令show dbs

> show dbs
db     0.001GB
local  0.000GB

怎样没有我们适才建立的test123呢?那是由于数据库中还没有内容,我们向test123中插进去db.[鸠合称号].insert(json花样的数据工具)一条数据,再看看!

> show dbs
db     0.001GB
local  0.000GB
> use test123
switched to db test123
> db
test123
> db.coll.insert({"title":"not data!"})
WriteResult({ "nInserted" : 1 })
> show dbs
db       0.001GB
local    0.000GB
test123  0.000GB

检察db.[鸠合称号].find()适才增添的数据

> use test123
switched to db test123
> db.coll.find()
{ "_id" : ObjectId("5a66e39914fea5f8ff237420"), "title" : "not data!" }

运用use敕令若是数据库不存在则建立,存在则切换到指定的数据库。

删除数据库

删除数据库运用db.dropDatabase()函数举行

起首检察一切的数据库

-玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。-
> show dbs
db       0.001GB
local    0.000GB
test123  0.000GB

接着切换到要删除的数据库test123

> use test123
switched to db test123

删除以后数据库

> db.dropDatabase()
{ "dropped" : "test123", "ok" : 1 }  #删除胜利

数据增添

数据增添要领:insert(),insertOne(),insertMany()

增添一条数据

/** insert()要领 **/

> db.person.insert({name:"张三",age:18,sex:"男"});
WriteResult({ "nInserted" : 1 })
> db.person.find()                             });
{ "_id" : ObjectId("5a7941c65f6d5986321c8416"), "name" : "张三", "age" : 18, "sex" : "男" }

/** insertOne()要领插进去一条数据 **/

> db.person.insertOne({name:"张三",age:18,sex:"男"});
{                                               dered:true})
        "acknowledged" : true,
        "insertedId" : ObjectId("5a7965855f6d5986321c8422")
}
> db.person.find()
{ "_id" : ObjectId("5a7965855f6d5986321c8422"), "name" : "张三", "age" : 18, "sex" : "男" }
>

增添多条数据

*** 体式格局一 把要插进去的数据放在一个数组中举行批量插进去***


/** insert()要领 **/

> db.person.insert( [ {name:"张三",age:18,sex:"男"}, {name:"李四",age:21,sex:"女"}, {name:"王五",age:20,sex:"男"}, {name:"赵六",age:19,sex:"女"} ],{ordered:true})
BulkWriteResult({
        "writeErrors" : [ ],
        "writeConcernErrors" : [ ],
        "nInserted" : 4,
        "nUpserted" : 0,
        "nMatched" : 0,
        "nModified" : 0,
        "nRemoved" : 0,
        "upserted" : [ ]
})

/** insertMany()要领 **/

> db.person.insertMany( [ {name:"张三",age:18,sex:"男"}, {name:"李四",age:21,sex:"女"}, {name:"王五",age:20,sex:"男"}, {name:"赵六",age:19,sex:"女"} ],{ordered:true})
{
        "acknowledged" : true,
        "insertedIds" : [
                ObjectId("5a7969ec5f6d5986321c8430"),
                ObjectId("5a7969ec5f6d5986321c8431"),
                ObjectId("5a7969ec5f6d5986321c8432"),
                ObjectId("5a7969ec5f6d5986321c8433")
        ]
}

多加了一个参数{ordered:true}透露表现有序插进去, 有序插进去碰到非常时它会直接返回,不会继承插进去数组中其他的文档纪录。不加此参数或许{ordered:false}为无序插进去, 无序的插进去会在碰到非常时继承实行

*** 体式格局二 运用bluk工具举行数据的批量增添 ***

  • 第一步:初始化一个批量操纵工具
var bulk = db.person.initializeUnorderedBulkOp();
  • 第二步:把要增添的数据增添到bulk工具中
bulk.insert({name:"赵六",age:19,sex:"女"});
bulk.insert({name:"赵六",age:19,sex:"女"});
bulk.insert({name:"赵六",age:19,sex:"女"});
  • 第三步:真正增添到数据库的要领
bulk.execute();

插进去文档你也可以或许运用 db.鸠合称号.save(document) 敕令。若是不指定 _id 字段 save() 要领类似于 insert() 要领。若是指定 _id 字段,则会更新该 _id 的数据。

insert()要领既可以或许插进去一个数组也可插进去一个工具,insertOne()要领只能插如一个工具,insertMany()只能插进去一个数组,insert()返回插进去胜利的纪录条数,而insertOne()和insertMany()要领返回胜利标记和插进去胜利的_objectId

数据查询

查询敕令:find(),findOne()

findOne()要领查询的结果已花样化输出了,find()要领要想花样化输出数据挪用pertty()润饰查询要领也能到达雷同的结果。

举例:db.person.find({age:18})
查询岁数即是18的人的一切信息

举例:db.person.find({age:{$gt:18}},{name:1,sex:1})
查询db数据库中person鸠合中岁数大于18的人的姓名和性别

申明:若是岁数小于18可以或许运用$lt操纵符,第二个参数{name:1,sex:1}内里透露表现显现的字段,若是不想显现某个字段那末就不消写若是第二个参数是{name:1},那末透露表现只显现姓名字段,若是悉数第二个参数都不写,那末默许显现一切的字段

润饰查询的要领:limit()【限定条数】,sort()【排序】,skip()【跳过】,pretty()【美化花样】

举例:db.person.find({age:{$gt:18}},{name:1,sex:1,age:1}).sort({age:-1}).limit(3).skip(1).pretty()
查询db数据库中person鸠合中岁数大于18的人的姓名和性别,然后依照岁数降序分列,然后取分列后的数据的前三条,然后再跳过一条数据后的鸠合

申明:sort({age:-1})中的【-1】透露表现降序分列,若是升序分列写成sort({age:1})就可以或许。

数据删除

删除要领:remove(),drop()

1、remove()和drop()要领的区分

举例:db.person.remove({})
remove要领中通报一个空数工具,会删掉db数据库中的person鸠合中的一切的文档,然则不会删除索引

举例:db.person.drop()
会删除db数据库中的person鸠合中的一切的文档,而且还会删除person鸠合中一切的索引。效力更高。

2、删除婚配前提的文档

举例:db.person.remove({name:"张三"})
删除db数据库中person鸠合中name即是张三的一切文档。

3、删除一条纪录

举例:
要领1 db.person.remove({name:"张三"},{justOne:true});
要领2 db.person.remove({name:"张三"},1);

只删除一个婚配前提的文档

数据修正

修正要领:update()

1、$set操纵符
举例:db.person.update({name:"张三"},{$set:{age:19}})
修正名字为张三的人的岁数为19岁,只修正一条纪录

2、$currentDate操纵符的作用
举例:db.person.update({name:"张三"},{ $set:{age:"123456"},$currentDate: { lastModified: true }})
为以后修正的文档增添一个末了修正时刻的字段

3、{multi:true}参数的作用
举例:db.person.update({name:"张三"},{$set:{age:20},$currentDate: { lastModified: true }},{multi:true})
默许情况下只修正相符前提的一个文档,若是多个文档相符前提而且都要修正只须要增添第三个参数{multi:true}就可以或许修正多个文档了。

4、upsert选项的作用
举例:db.person.update({name:"张三"},{name:'张三三',age:20,sex:"男"},{upsert:true})
默许情况下婚配不到更新前提的文档,update将不做任何操纵,若是增添了{upsert:true}参数,在没有找到婚配文档的情况下,它将会插进去一个新的文档。

注重:mongondb在修正数据的时刻回依据数据的范例自动修正文档中原始的数据范例,比方一个文档中的岁数为数字范例,你修正这个纪录的时刻把岁数传入一个字符串,那末此文档中岁数字段的范例就变成了字符串范例。

索引

索引一般可以或许极大的进步查询的效力,就像书的目次一样,若是没有索引mongodb就会去扫描鸠合中的每一个文件并拔取相符查询前提的数据,在数据量大的时刻这类查询相率很低下

运用db.鸠合称号.getIndexes()猎取鸠合索引

> db.person.getIndexes()
[
        {  //person鸠合的默许索引
                "v" : 1, //升序分列
                "key" : {
                        "_id" : 1 //索引列
                },
                "name" : "_id_", //索引称号
                "ns" : "test.person" //指定鸠合
        }
]

建立索引

建立索引的要领:createIndex()

举例:db.person.createIndex({"name":1})
在person鸠合中针对name字段建立一个升序分列的索引

> db.person.getIndexes()
[
        { // 默许索引
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "test.person"
        },
        { //新建立的索引
                "v" : 1,
                "key" : {
                        "name" : 1
                },
                "name" : "name_1",
                "ns" : "test.person"
        }
]

删除索引

删除索引运用敕令:dropIndex()
举例:db.person.dropIndexes({"name":1})

> db.person.getIndexes() //查询索引
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "test.person"
        },
        {
                "v" : 1,
                "key" : {
                        "name" : 1
                },
                "name" : "name_1",
                "ns" : "test.person"
        }
]
> db.person.dropIndex({"name":1})  //删除
{ "nIndexesWas" : 2, "ok" : 1 }
> db.person.getIndexes() //查询索引
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "test.person"
        }
]

删除悉数索引运用敕令:dropIndexes()
举例:db.person.dropIndexes()

> db.person.getIndexes() //查询索引
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "test.person"
        },
        {
                "v" : 1,
                "key" : {
                        "name" : 1
                },
                "name" : "name_1",
                "ns" : "test.person"
        }
]
> db.person.dropIndexes() //删除悉数索引
{
        "nIndexesWas" : 2,
        "msg" : "non-_id indexes dropped for collection",
        "ok" : 1
}
> db.person.getIndexes() //查询索引
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "test.person"
        }
]

删除悉数索引指的是:name为非_id_的索引(默许索引)

导出数据文件

mongodump -h IP --port 端口 -u 用户名 -p 暗码 -d 数据库 -o 文件存在途径 
  • 若是没有用户谁,可以或许去掉-u和-p。
  • 若是导出本机的数据库,可以或许去掉-h。
  • 若是是默许端口,可以或许去掉--port。
  • 若是想导出一切数据库,可以或许去掉-d。

导出悉数数据数据库

mongodump -h 127.0.0.1 -o E:mongondbdump 

导入数据文件

> mongorestore -h IP --port 端口 -u 用户名 -p 暗码 -d 数据库 --drop 文件存在途径 

--drop参数:先删除一切的纪录,然后规复。

导入悉数数据库

> mongorestore E:mongondbdump #数据库的备份途径

导入test123数据库

> mongorestore -d user E:mongondbdumptest123  #test123这个数据库的备份途径  

原文地点

-玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。