mongo 学习教程(全)

看的是爱酷学习网的视频:http://www.icoolxue.com/album/show/98

01

安装

1、先建mongoDB-data文件夹存数据

2、安装DB

3、设置环境变量:把bin目录:D:\mongodb\bin,添加到path下(;D:\mongodb\bin),好处是可以直接在cmd的命令行中输入mongod运行(这样也可检测),如果不设置环境变量,需要cd到当前目录下才能mongodb

启动

使用批处理文件来启动mongoDB,mongod.exe -dbpath d:\data

mongod help:查看常用的命令,mongodb启动命令参数说明:http://blog.csdn.net/fdipzone/article/details/7442162

27017:shell 客户端,28017:web

表:集合,行:文档

BSON对JSON的扩展,把json转为二进制码,增加了日期,浮点等json不支持的数据类型

nosql:集合(表),文档(行)。没有主键,关系数据库的每行的字段都是一样的,mongodb就不一定;关系数据库使用sql语句查询,mongodb使用find函数。

创建数据库:use foobar,只有加入相应的list,才会真正创建;

启动错误:32-bit servers don‘t have journaling enabled by default.由于上次的非正常关闭导致的,删掉上次的lock就好

启动shell

mongo 127.0.0.1:27017/admin

创建数据库:use foobar:只有加入list才会真正被创建;查看所有数据库:show dbs

查看所有文档:show collections

添加集合:db.persons.insert({name,‘sfp‘});mongodb会自动创建一个_id,生成集合system.indexes

查看指定文档的数据:db.persons.find();db.persons.findOne();

更新:db.persons.update({name:‘sfp‘},{name,‘sfp1‘}):查询器,修改器

   另一种方式:var p=db.persons.findOne(); db.persons.update(p,{name,‘sfp1‘});这种更新内容是正常的

                                   {age,‘1‘};更新后的文档只有age,所以才需要$set修改器

删除:db.persons.remove({})

02

删除集合:db.persons.drop()

删除数据库:db.dropDatebase()

全局help,数据库db.help(),集合db.persons.help()

命名的特殊情况:集合名(db-text),只能通过db.getCollection(‘db-text‘)得到此集合。

API:http://api.mongodb.org/js/2.7.7/

03

主要是讲增,删,改。

insert:可以手动加_id

批量插入:如果用[{},{}],则会插入一个文档,用0,1索引对应的{}。所以需要使用for循环来批量插入

save:与insert的区别,id相同时,save会变为更新语句,而insert会报错

db.persons.remove({}):集合被删除,索引不会被删除

数据量特别大的集合:drop再建索引,比remove效率高。如何为集合建立索引?

强硬文档替换式更新操作:文档替换;id冲突时会报错(原id有3,把id为2的改为3,则报错)

({},{},true):找不到,insert文档;能找到,update文档

({},{},false,true):批量更新,修改器需使用$set

修改器

$set 有这个键,更新;没有这个键,添加。
$inc 数字域,{age:27},{$inc:{age:1}}
$unset 去掉某个键,{age:27},{$uninc:{age":1}}
$push 数组键,1、给指定的数组键增加一个新的数值;2、如果不存在指定的数组键,则新建数组键;3、如果指定的不是数组键,则中断
$pushAll 批量插入
$addToSet 数组中存在要加的值,则忽略;不存在,则增加
$pop 删除数组中指定的值,1:最后一个;-1:第一个
$pull 删除数组中指定的值
$pullAll 批量删除
$ 数组定位器,{“books.type”:"js"},{$set:{"books.$.author":"uspcat"}}

$addToSet和$each:批量更新数组,{$addToSet:{books:{$each:["js","db"]}}}

04

一个document创建后,会分配一定内存,会预留一部分内存。在预留的内存中修改时比较快;在未分配的内存中修改时比较慢。

runCommend:执行mongoDB的特殊函数

findAndModify:返回update或remove的文档

05

主要讲find,分页与排序,游标

返回指定的键:db.persons.find({},{_id:0,name:1,country:1});         _id默认返回,所以需要指定为0,不反回

查询条件:$lt,$lte,$gt,$gte,$ne

1、年龄在25-27之间:age:{$gte:25,$lte:27}

2、不是韩国学生的数学成绩:({cuntry:{$ne:korea}},{m:1})

包含$in,不包含$nin(只针对数组有效)

3、中国或美国:country:{$in:["china","us"]}

$or

4、语文高于85或英语高于90:$or:[{c:{$gt:85}},{e:{$gt:90}}]

5、正则查询,名字中包含li的:name:{/li/i}

$not(范围广,不局限于数组)

6、名字中没有li的:name:{$not:/li/i}

$all,index

7、喜欢mongodb,js的学生:books.{$all:["js","mongodb"]}

8、喜欢的第二本书是Java:"books.1":"java"

$size:不能与比较符一起使用(不足)

9、书为四本的学生:books:{$size:4}

10、数量大于3本的学生:由于$size的不足,所以需要三步

  1、加size字段:{$set:{size:4}},false,true:批量增加字段

  2、改变书籍的更新方式:{$push:{books:"oracle"},$inc:{size:1}}

  3、利用$gt查询

11、喜欢书的数量:


1

2

3

4

5

var jim=db.persons.find({name:"jim"});   //得到的jim是游标,所以需要以下处理。在具体情况中,可以试验一下用数组可以不?返回的应该是数组。

while(jim.hasNext()){

    var obj=jim.next();

    print(obj.books.length);

}<br>

$lt,$lte,$gt,$gte,$ne,$or,$not,$all,$size

06

$slice:返回指定数组的内部值

12、2-4本书:books:{$slice:[1,3]}

$elemMatch:文档查询:对象嵌套

13、在K上过学:school:{school:"K",score:"A"},需要完全匹配;顺序也需要一致

  解决办法:"school.score":"A","school.school":"K"  或者  也可以只写一个 "school.school":"K"

  新问题:school:A,score:D,也会有结果。

  解决办法:school:{$elemMath:{school:"K",score:"A"}}

$where:万能,性能低

14、年龄大于22,喜欢Java,在K上过学:find($("where"):function(){}),跟Java中的查询类似

$slice,$elemMatch,$where.

分页与排序

查前5:find().limit(5)

跨越5条:find().limit(5).skip(5)

排序:find().limit(5).skip(5).sort({name:1}),1为正序,-1为倒序

skip性能有问题---换种方式---加date字段,一般来说skip就够了。

游标

销毁条件:1、迭代完;2、客户端命令;3、10分钟不用。

快照

find({,$snapshot:true}),使用快照,则需使用高级查询。

如果不用快照的话,游标到了3,如果加了100个键,增大,则会把3放在最后,且扩容,把4变为3

用快照的话,不会发生以上的情况

高级查询

$query, $orderby, $maxsan, $min, $max, $hint, $explain, $snapshot

07

索引,管理,空间索引

索引(目录)

db.books.ensureIndex({number:1},{name:"bookname"}),-1:倒序

提高查询性能,影响插入性能,查多插少可考虑索引;索引不一定提高性能;排序也可加索引。

唯一索引:{unique:true}

建唯一索引前已有重复值:{dropDups:true}

本次查询指定索引:.hint({name:1})

管理

查看本次查询的信息:explain()

数据库中所有的索引:db.system.indexes.find();  或者  db.system.namespace.find()

因为建索引会锁表,所以需要让索引在后台创建:{background:true}

删除索引:精确删除:db.runCommand({dropIndexes:‘books‘,index:‘name_1‘});批量删除:db.runCommand({dropIndexes:‘books‘,index:‘*‘})

08

空间索引

db.map.ensureIndex({‘gis‘:‘2d‘},{min:-1,max:201})

距离最近:db.map.find({gis:{$near:[70,180]}}).limit(3)

方形内:db.map.find({gis:{$within:{$box:[[50,50],[190,190]]}}})

圆形内:db.map.find({gis:{$within:{$center:[[50,50],[190,190]]}}})

09

count+distinct+group,命令操作,固定集合,gridFs文件系统,服务器端脚本

count

1、查询美国学生人数:find({country:"usa"}).count()

distinct

2、有多少国家分别是什么:runCommand({distinct:"persons",key:"country"}).value(),去重

group

3、persons中每个国家学生数学成绩最好的学生,必须在90以上


1

2

3

4

5

6

7

8

9

10

<span style="font-size: 16px;">runCommand({group:{

   ns:"persons",    //集合名

   key:{"country":true},   //分组的键

   initial:{m:0},   //初始化累加器

   $reduce:function(doc,perv){},   //每个文档执行reduce方法,(组内本条记录,累加器数据)

   condition:{m:{$gt:90}},   //条件

   finalize:function(){},   //完成器,把每个人的信息链接起来写一个描述赋值到m上。

    }

})

</span>

4、如果有键country和counTry,则需


1

2

3

4

<span style="font-size: 16px;">$keyf:function(doc){

   return {country:doc.counTry}          //reduce函数也需要改一下,

}

</span>

命令操作

删除list:db.runCommand({drop:"map"});

查询runCommand能够执行的所有命令:db.listCommands();(http://chenzhou123520.iteye.com/blog/1629946)

10

固定集合:固定的大小和文档数

特性:1、没索引,没_id;2、插入块,查询快;3、适合日志

创建大小100字节,存10个文档:db.createColllection("mycoll",{size:100,capped:true,max:10})

普通集合转固定集合:db.runCommand({convertToCapped:"persons",size:100})

反向排序:db.mycoll.find().sort({$natural:-1})

尾部游标(shell不支持,Java,php支持):不会自动销毁,等待结果

GridFS:把本地文件存入mongoDB,使用mongofiles.exe

上传:mongofiles -d foobar -l "e:\a.txt" put "a.txt"

查询:db.fs.chunks.find();   或者  db.fs.files.find()

查看文件内容(VUE,shell不行):mongofiles -d foobar get "a.txt"

查看所有文件:mongofiles -d foobar list

删除文件(VUE,shell不行):mongofiles -d foobar delete "a.txt"

服务器端的脚本:主要讲的是shell中可以使用eval函数:db.eval("function(name){return name}","uspcat");

写入全局变量:db.system.js.insert({_id:name,value:"uspcat"});  db.eval("return name");

进而可以演变为存储方法:把"uspcat"写为"function(){}"

11

启动配置;导出,导入,运行时备份;Fsync锁,数据修复;用户管理,安全认证;

启动项:--dbpath; --port; --fork(保护进程的方式启动); --logpath; --config; -auth(安全认证)

利用config启动,并改端口为8888

mongodbconf.bat:mongod.exe --config mongod.conf

mongod.conf:dbpath = d:\data

         port = 8888

启动mongodbconf.bat

停止shell:

1、右键关,不好,下次启动出问题后,把lock删了

2、ctrl+c

3、use admin, db.shutdownServer()

导出

mongoexport -d -c -o -csv -q --type<json/csv/txv>

mongoexport -d foobar -c port -o D:\persons.json

导出其他数据库的:mongoexport --host --port

导入

mongoimport --db foobar --collection persons --file d:\persons.json

运行时备份:

mongodump --host -d -o  (有数据丢失,后面会解决)

恢复:mongorestore --host -d -directoryperdb

12

缓冲池:数据先写入缓冲池,再写入数据库,运行时备份只会备份数据库的,会丢失缓冲池的,所以需要锁

上锁:把缓冲池的数据全部写入数据库:db.runCommand({fsync:1,lock:1})

解锁:db.currentUp()

修复:db.repairDatabase()

用户管理,安全认证

添加用户:db.addUser("uspcat‘,"123")

需启用用户,才能查询数据库:db.auth("uspcat","123")

非admin用户不能用数据库命令:如show dbs.

删除用户:db.system.users.remove({user,"uspcat"})

13

主从复制,副本集

主从复制:数据库同步备份的集群技术

--master 主;--slave,--source 从

主:dbpath; port; bind_ip; master;

从:dbpath; port; bind_ip; source; slave;

配置好后,在主中写入数据,在从中可以看到。

默认会监听所有的数据库,通过

--only指定需复制的数据库

--slavedelay:同步延迟

--fastsync:把内存中的数据写入主数据库,进行从备份

--autoresync:不同步的重新同步,从才备份

--oplogsize(主):把主的操作记录到oplog,在从中运行一遍

动态添加和删除从的节点

查看:db.sources.find()

添加:db.sources.insert({"host":"127.0.0.1"8888"})

删除:db.sources.remove({"host":"127.0.0.1"8888"})

14

副本集

A故障后,B,C中选一个作为活跃,A恢复后,依然为备份。

设置副本集:

初始化副本集:

只有活跃点才能查询(rs.status()),备份的不能查询。

新的仲裁方式:备份的时间早的为活跃。

读写分离:slaveOkay:true;  在shell中不行,高级驱动可以

oplog:保存节点操作

主从:2台就可以,副本:3台以上。

15

这节讲的是分片,挺有意思的,自己试一下,综合性很强。

路由监听配置服务器,线画错了。

router.bat:mongos --port 1000 --configdb 127.0.0.1:2000

peizhi.bat:mongod --config peizhi.conf

peizhi.conf:dbpath = D:\mongodb\config   //不用加""

      port = 2000

      bind_ip = 127.0.0.1

01.bat:mongod --config 01.conf

01.conf:dbpath = D:\mongodb\8081   

    port = 8081

    bind_ip = 127.0.0.1

01_8081.bat:mongo 127.0.0.1:8081/admin

02.bat:mongod --config 02.conf

02.conf:dbpath = D:\mongodb\8082   

    port = 8082

    bind_ip = 127.0.0.1

02_8082.bat:mongo 127.0.0.1:8082/admin

利用路由为集群增加分片:

打开四个bat,打开router的shell。

db.runCommand({addshard:"127.0.0.1:8081",allowLocal:true}); db.runCommand({addshard:"127.0.0.1:8082",allowLocal:true})

打开数据分片功能,为foobar打开分片功能:

use foobar, insert, db.runCommand({"enablesharding":"foobar"});

对集合进行分片:

db.runCommand({"shardCollection":"foobar.bar","key":{"_id":1}})   //使用数据库foobar中集合bar的key键进行分片

插入数据


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

function add(){

    var i=0;

    for(;i<200000;i++){

        db.bar.insert({"age":i+10, "name":"jim"})

    }

}

function add2(){

    var i=0;

    for(;i<200000;i++){

        db.bar.insert({"age":12, "name":"tom"+i})

    }

}

function add3(){

    var i=0;

    for(;i<200000;i++){

        db.bar.insert({"age":i+10, "name":"lili"+i})

    }

}

在01和02的shell中可以看到分配的数据。

在路由的shell中,输入db.peintShardingStatus();

在路由的shell中,use config, show dbs,db.shards.find();   //两个片区 db.mongos.find().

that‘s it!

更多的知识:配置服务器做成集群

片区与副本集结合使用

摘自:http://www.cnblogs.com/wang-jing/p/3975904.html

时间: 2024-11-07 12:03:24

mongo 学习教程(全)的相关文章

PLSQL循序渐进全面学习教程(全)

课程 一 PL/SQL 基本查询与排序 本课重点: 1.写SELECT语句进行数据库查询 2.进行数学运算 3.处理空值 4.使用别名ALIASES 5.连接列 6.在SQL PLUS中编辑缓冲,修改SQL SCRIPTS 7.ORDER BY进行排序输出. 8.使用WHERE 字段. 一.写SQL 命令: 不区分大小写. SQL 语句用数字分行,在SQL PLUS中被称为缓冲区. 最后以:或 / 结束语句. 也可以用RUN来执行语句 二.例1:SQL> SELECT dept_id, last

Python学习教程:最全Python110道面试题!面试你肯定用得上!

Python学习教程(Python学习路线):最全Python面试题! 为了大家更好的消化,这里分成几次给大家出题目和教程! 1.一行代码实现1--100之和 利用sum()函数求和 2.如何在一个函数内部修改全局变量 函数内部global声明 修改全局变量 3.列出5个python标准库 os:提供了不少与操作系统相关联的函数 sys: 通常用于命令行参数 re: 正则匹配 math: 数学运算 datetime:处理日期时间 4.字典如何删除键和合并两个字典 del和update方法 5.谈

2019年史上最全面的web前端学习教程!

要想成为一个优秀的前端工程师,肯定是要有一份良好的学习教程! 先给大家看看一个年薪30的前端程序员该学习哪些? 好的web前端年薪会有多少?一定要看到最后 不少前辈高人们放出了自己的工资截图,也有新人出来表示瞻仰.高的4,50w往上走都有(更高的个例也不是没有),低的实习小几千的也不少,最后总结了一下,其实可以凝聚为两个词--"技术"和"经验". 其实这个不难明白,企业的最终目的就是为了盈利.人家给你开那么多的工资必然是因为你能够给公司创造更大的价值.那问题就来了

Makefile学习教程 跟我一起写 Makefile

https://github.com/zhangliyong/myknowledge/blob/master/Makefile%E5%AD%A6%E4%B9%A0%E6%95%99%E7%A8%8B%20%E8%B7%9F%E6%88%91%E4%B8%80%E8%B5%B7%E5%86%99%20Makefile.wiki ++ Makefile学习教程 跟我一起写 Makefile 0 Makefile概述 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Wi

Deep Learning五:PCA and Whitening_Exercise(斯坦福大学UFLDL深度学习教程)

前言 本文是基于Exercise:PCA and Whitening的练习. 理论知识见:UFLDL教程. 实验内容:从10张512*512自然图像中随机选取10000个12*12的图像块(patch),然后对这些patch进行99%的方差保留的PCA计算,最后对这些patch做PCA Whitening和ZCA Whitening,并进行比较. 实验步骤及结果 1.加载图像数据,得到10000个图像块为原始数据x,它是144*10000的矩阵,随机显示200个图像块,其结果如下: 2.把它的每

PhotoShop学习教程助你取悦好用户设计

在PhotoShop学习教程中,设计是一个重要的学习目的.但是,是否能够做到完美设计,或者说是否能在设计上独树一格,被自己的客户认可,也是设计师们必须考虑的事情.PhotoShop学习教程可以教给大家做非常完美的设计,比如,可以教给大家如何在坚持原则的基础上还能取悦客户. 在设计文案之前,整个空白页面的构架也应该考虑的差不多了.其中,三个问题非常重要,何物(What):解释这个页面在说什么:何地(Where):告知用户当前的位置,以及接下来可以干什么:何时(When):解释此处空白在什么情况下将

苹果电脑怎么录制学习教程?

关于苹果手机的录制学习教程的软件今天小编就要好好和大家介绍一番了,其次就是桌面录屏软件的操作方法及步骤小编在这里都会统统向大家来介绍,那些想要学习的宝宝们相信这款软件对你们的作用还是挺大的,因为这款软件适用于新手宝宝使用,操作起来方便简单,对你们的学习也会有提高的.如果对苹果电脑录制教程感兴趣的话就可以接着往下面看了. 桌面录屏软件http://www.xunjieshipin.com/download-luping 屏幕录像工具http://www.onlinedown.net/soft/11

Python学习教程(Python学习路线):python—收集系统信息

Python学习教程(Python学习路线):python—收集系统信息  1.1 hashlib模块使用 获取文件的MD5值,和shell下的MD5sum一样 方法一:先实例化一个对象,再使用update做校验,最后十六进制查看hexdigest In [3]: import hashlib In [5]: md5 = hashlib.md5 In [6]: md5.update("a") In [7]: md5.hexdigest Out[7]: '0cc175b9c0f1b6a8

拓幻图形学工程师教学手册(第一讲)|一字一字敲出OpenGL学习教程

动机首先申明,我是拓幻科技图形处理工程师,自己接触OpenGL,图形图像等方面也有六年多了,很多人其实并不了解这方面,也不了解如何系统地去学,我觉得基于我硕士时期的课程和经验给大家.这些资料和经验也得感谢我的老师,来自普渡大学的终生教授迈克 贝利(Mike Bailey). 以此连载OpenGL学习教程,给大家讲解,一起学习一下,不对之处,欢迎大家指出讨论. 所有渲染工作都离不开OpenGL, 着色器(Shader)这些,如果你和我一样对图形处理比较感兴趣的话,可能你和当初的我有着同样的困惑:如