mongodb学习笔记
-------------------------临时变量名含义解释---------------------------------------
database【数据库名】
collectionName【集合名,表名】
document【文档】
key【key值,表字段】
value【value值,字段值】
oldValue【旧value值】
newValue【新value值】
----------------------########-----基本命令--------########---------------------------------
use database;【创建一个数据库(使用该数据库),不操作会给mongo自动删除】
show dbs;【查看所有数据库】
show collections【查看数据库中的所有文档】
db.collectionName.find();【查询制定文档的数据,查询所有】
db.collectionName.findOne();【查询制定文档的数据,查询第一条数据】
db.collectionName.drop();【删除库中的集合】
db.dropDatabase();【删除数据库】
db.help();【Shell的help】
db.collectionName.insert({key:"value"});【插入文档,批量插入文档就是循环执行插入操作】
db.collectionName.save({key:"value"});【save操作,id相同时更新操作,id不同是插入操作】
db.collectionName.remove();【删除列表中所有数据,索引不会被删除】
db.collectionName.remove({key:"value"});【根据条件删除】
db.collectionName.update({key:"oldValue"},{key:"newValue"});【强硬的文档替换式更新操作】
db.collectionName.update({key:"oldValue"},{key:"newValue"},true);【insertOrUpdate操作,第三个参数为true】
db.collectionName.update({key:"oldValue"},{$set:{key:"newValue"}},false,true);【批量更新操作,第四个参数为true】
db.collectionName.find({},{_id:0,key:1,key:1});【查询所有数据的指定键(key,key)】
db.listCommands();【mongo为我们提供的命令】
db.runCommand({buildinfo:1});【查询服务器版本号和主机操作系统】
db.runCommand({collStats:"persons"});【查询执行集合的详细信息,大小,空间,索引等】
db.runCommand({getLastError:"persons"});【查看操作本集合最后一次错误信息】
db.runCommand({sync:1,lock:1});【上锁】
db.currentOp();【解锁】
db.repairDatabase();【数据修复】
------------------------------数据库和集合命名规范----------------------------------
1.不能是空字符串
2.不得含有''、 (空格)、,、$、/、\、和\0(空字符)
3.应全部小写
4.最多64个字节
5.数据库名不能与现在系统保留库同名,如admin,local,config
------------------------------这样的集合名字也是合法的----------------------------------
db-text是合法的
但是不能通过db.db-text.insert({key:11})得到
要改为db.getCollection("db-text")可以得到
因为db-text会被当成是 减法操作
----------------------------------------------------------------
mongodb的shell内置javascript引擎可以直接执行js代码
shell可以用eval
----------------------------BSON-------扩充的数据类型-----------------------------
# BSON是JSON的扩展它先新增了诸如日期,浮点等JSON不支持的数据类型
null【用于表示空或者不存在的字段】
布尔【两个个数值true和false】
32位和64位整数【shell中不支持需用到其他高级语言的驱动来完成,js不可使用】
64位浮点【shell中使用的数字其实全是这种类型{x:3.414}】
UTF-8【其实就是字符串类型】
对象ID【内置默认ID对象(_id:objectId())】
日期【{x:new Date()}】
正则【{x:/uspcat/i}】
javascript代码块【{x:function(){...}}】
undefined【为定义类型注意它和null不是一个类型】
数组【array:[20,30,40]】
内嵌文档【{x:{name:"uspcat"}}】
二进制【任意字节的字符串shell中时无法使用的】
http://api.mongodb.com/js/3.2.7/index.html【mongoDB的API】
------------------------使用修改器来完成局部更新操作----------------------------------------
它用来指定一个键值对,如果存在键就进行修改不存在则进行添加
$set
{$set:{key:value}}
## ----------------------
只是使用与数字类型,他可以为指定的键对应的数字类型的数值进行加减操作
$inc
{$inc:{key:value}}
## ----------------------
它的用法很简单,就是删除指定的键
$unset
{$unset:{key:value}}
## ----------------------
1.如果指定的键是数组增追加新的数值
2.如果指定的键不是数组则中断当前操作Cannot apply $push/$pushAll modifier to non-array
3.如果不存在指定的键则创建数组类型的键值对
$push
{$push:{key:value}}
## ----------------------
用法和$push相似它可以体谅添加数组数据
$pushAll
{$pushAll:{key:value}}
## ----------------------
目标数组存在此项则不操作,不存在此项则加进去
$addToSet
{$addToSet:{key:value}}
## ----------------------
从指定数组删除一个值1删除最后一个数值,-1删除第一个数值
$pop
{$pop:{key:value}}
## ----------------------
删除一个被指定的数值
$pull
{$pull:{key:value}}
## ----------------------
一次性删除多个指定的数值
$pullAll
{$pullAll:{key:value}}
## ----------------------
1.数组定位器,如果数组有多个数值我们只想对其中一部分进行操作我们就要用到定位器($)
例子:
例如有文档{name:”YFC”,age:27,books:[{type:’JS’,name:”EXTJS4”},{type:”JS”,name:”JQUERY”},{type:”DB”,name:”MONGODB”}]}
我们要把type等于JS的文档增加一个相同的作者author是USPCAT
办法:
db.text.update({"books.type":"JS"},{$set:{"books.$.author":"USPCAT"}})
## ----------------------
$addToSet与$each结合完成批量数组更新
db.text.update({_id:1000},{$addToSet:{books:{$each:[“JS”,”DB”]}}})
$each会循环后面的数组把每一个数值进行$addToSet操作
## ----------------------
存在分配与查询效率
当document被创建的时候DB为其分配没存和预留内存当修改操作,不超过预留内层的时候则速度非常快反而超过了就要分配新的内存,则会消耗时间
--------------------=========---查询条件----------=======-------------------------------
$lt【<,例如:{age:{$gte:22,$lte:27}}】
$lte【<=】
$gt【>】
$gte【>=】
$ne【!=,例如:{age:{$ne:26}}】
$in【包含,例如:db.persons.find({country:{$in:["USA"]}},{_id:0,country:1});】
$nin【不包含,例如:db.persons.find({country:{$nin:["USA"]}},{_id:0,country:1});】
$or【or查询,例如:db.persons.find({$or:[{c:{$gt:85}},{e:{$gt:90}}]},{_id:0,c:1,e:1});】
null【查询值为null的数据,例如:db.persons.find({sex:{$in:[null]}},{_id:0,country:1});】
正则查询【例如:db.persons.find({name:/li/i},{_id:0,name:1});】
$not【查询任何地方进行取反操作,例如:db.persons.find({name:{$not:/li/i}},{_id:0,name:1});】
$all【数组查询,例如:db.persons.find({books:{$all:["JS","MONGODB"]}},{_id:0,name:1});】
$slice【查询文档中指定数组的内部值】
$where【查询复杂的查询可以使用,但是性能不好】
limit【返回指定的数据条数,例如:db.persons.find({},{_id:0,name:1}).limit(5);】
skip【返回指定数据的跨度(分页查询),例如:db.persons.find({},{_id:0,name:1}).skip(0).limit(3);】
sort【排序(1为正序,-1为倒序),例如:db.persons.find({},{_id:0,age:1}).skip(0).limit(6).sort({age:-1});】
count【查询个数,例如:db.persons.find({country:"USA"}).count();】
--------------------------索引--------------------------------------
ensureIndex【创建索引(1为正序索引,-1为倒序索引),例如:db.text.ensureIndex({number:-1});】
unique【唯一索引,例如:db.text.ensureIndex({name:-1},{unique:true});】
dropDups【创建索引删除重复值,例如:db.text.ensureIndex({name:-1},{unique:true,dropDups:true});】
hint【根据指定索引进行查询数据(指定的索引必须是已经创建好的索引),例如:db.text.find({number:123123}).hint({number:1});】
explain【查看本次查询使用哪个索引和查询数据状态信息(cursor:使用的索引,nscanned:查到几个文档,millis:查询时间),例如:db.text.find({number:123123}).explain();】
system.indexes【查看数据库已经建立的索引,例如:db.system.indexes.find();db.system.namespaces.find();】
background【执行创建索引的过程会暂时锁表(后台执行),例如:db.text.ensureIndex({name:-1},{background:true});】
runCommand【删除索引,例如:db.runCommand({dropIndexes:"text",index:"name_-1"});】
【添加2D索引,例如:db.map.ensureIndex({"gis":"2d"},{min:-1,max:201});】
db.map.find({gis:{"$within":{$box:[[50,50],[190,190]]}}},{_id:0,gis:1});【查询以点(50,50)和点(190,190)为对角线的正方形中的所有的点】
db.map.find({gis:{$within:{$center:[[56,80],50]}}},{_id:0,gis:1});【查询出以圆心为(56,80)半径为50规则下的圆心面积中的点】
-------------------------------mongo固定集合-------------------------------------------
db.createCollection("mycoll",{size:100,capped:true,max:10});【创建一个新的固定集合要求大小是100字节,可以存储文档10个】
db.runCommand({convertToCapped:"name",size:10000});【把一个普通集合转换成固定集合】
db.mycoll.find().sort({$natural:-1});【查询固定集合mycoll并且反响排序】
--------------------------服务器端脚本------------------------------------------------
db.eval("function(name){return name}","helloworld");【服务器端运行eval】
--------------------------mongo启动配置详讲------------------------------------------------
1.启动项mongo --help
--dbpath【指定数据库的目录,默认在windows下是c:\data\db\】
--port【指定服务器监听的端口号码,默认是27017】
--fork【用守护进程的方式启动mongoDB】
--logpath【指定日志的输出路径,默认是控制台】
--config【指定启动项用文件的路径】
--auth【用安全认证方式启动数据库】
--------------------------用户管理,安全认证------------------------------------------------
db.addUser("admin":"123456");【添加一个用户】
db.auth("admin":"123456");【启用用户】
db.system.users.remove({"user":"admin"});【用户删除操作】
--auth【安全检查】
-----------------------------主从复制---------------------------------------------
--master【用来确定主服务器】
--slave【控制从服务器】
--source【控制从服务器】
-----------主配置----------------
dbpath = D:\sortware\mongod\01\8888 主数据库地址
port = 8888 主数据库端口号
bind_ip = 127.0.0.1 主数据库所在服务器
master = true 确定我是主服务器
------------从配置---------------------
dbpath = D:\sortware\mongod\01\7777 从数据库地址
port = 7777 从数据库端口号
bind_ip = 127.0.0.1 从数据库所在服务器
source = 127.0.0.1:8888 确定我数据库端口
slave = true 确定自己是从服务器
2.主从复制的其他设置项
--only 从节点?指定复制某个数据库,默认是复制全部数据库
--slavedelay 从节点?设置主数据库同步数据的延迟(单位是秒)
--fastsync 从节点?以主数据库的节点快照为节点启动从数据库
--autoresync 从节点?如果不同步则从新同步数据库
--oplogSize 主节点?设置oplog的大小(主节点操作记录存储到local的oplog中)
3.利用shell动态添加和删除从节点
不难看出从节点中关于主节点的信息全部存到local的sources的集合中
我们只要对集合进行操作就可以动态操作主从关系
挂接主节点:操作之前只留下从数据库服务
db.sources.insert({“host”:”127.0.0.1:8888”})
删除已经挂接的主节点:操作之前只留下从数据库服务
database【数据库名】
collectionName【集合名,表名】
document【文档】
key【key值,表字段】
value【value值,字段值】
oldValue【旧value值】
newValue【新value值】
----------------------########-----基本命令--------########---------------------------------
use database;【创建一个数据库(使用该数据库),不操作会给mongo自动删除】
show dbs;【查看所有数据库】
show collections【查看数据库中的所有文档】
db.collectionName.find();【查询制定文档的数据,查询所有】
db.collectionName.findOne();【查询制定文档的数据,查询第一条数据】
db.collectionName.drop();【删除库中的集合】
db.dropDatabase();【删除数据库】
db.help();【Shell的help】
db.collectionName.insert({key:"value"});【插入文档,批量插入文档就是循环执行插入操作】
db.collectionName.save({key:"value"});【save操作,id相同时更新操作,id不同是插入操作】
db.collectionName.remove();【删除列表中所有数据,索引不会被删除】
db.collectionName.remove({key:"value"});【根据条件删除】
db.collectionName.update({key:"oldValue"},{key:"newValue"});【强硬的文档替换式更新操作】
db.collectionName.update({key:"oldValue"},{key:"newValue"},true);【insertOrUpdate操作,第三个参数为true】
db.collectionName.update({key:"oldValue"},{$set:{key:"newValue"}},false,true);【批量更新操作,第四个参数为true】
db.collectionName.find({},{_id:0,key:1,key:1});【查询所有数据的指定键(key,key)】
db.listCommands();【mongo为我们提供的命令】
db.runCommand({buildinfo:1});【查询服务器版本号和主机操作系统】
db.runCommand({collStats:"persons"});【查询执行集合的详细信息,大小,空间,索引等】
db.runCommand({getLastError:"persons"});【查看操作本集合最后一次错误信息】
db.runCommand({sync:1,lock:1});【上锁】
db.currentOp();【解锁】
db.repairDatabase();【数据修复】
------------------------------数据库和集合命名规范----------------------------------
1.不能是空字符串
2.不得含有''、 (空格)、,、$、/、\、和\0(空字符)
3.应全部小写
4.最多64个字节
5.数据库名不能与现在系统保留库同名,如admin,local,config
------------------------------这样的集合名字也是合法的----------------------------------
db-text是合法的
但是不能通过db.db-text.insert({key:11})得到
要改为db.getCollection("db-text")可以得到
因为db-text会被当成是 减法操作
----------------------------------------------------------------
mongodb的shell内置javascript引擎可以直接执行js代码
shell可以用eval
----------------------------BSON-------扩充的数据类型-----------------------------
# BSON是JSON的扩展它先新增了诸如日期,浮点等JSON不支持的数据类型
null【用于表示空或者不存在的字段】
布尔【两个个数值true和false】
32位和64位整数【shell中不支持需用到其他高级语言的驱动来完成,js不可使用】
64位浮点【shell中使用的数字其实全是这种类型{x:3.414}】
UTF-8【其实就是字符串类型】
对象ID【内置默认ID对象(_id:objectId())】
日期【{x:new Date()}】
正则【{x:/uspcat/i}】
javascript代码块【{x:function(){...}}】
undefined【为定义类型注意它和null不是一个类型】
数组【array:[20,30,40]】
内嵌文档【{x:{name:"uspcat"}}】
二进制【任意字节的字符串shell中时无法使用的】
http://api.mongodb.com/js/3.2.7/index.html【mongoDB的API】
------------------------使用修改器来完成局部更新操作----------------------------------------
它用来指定一个键值对,如果存在键就进行修改不存在则进行添加
$set
{$set:{key:value}}
## ----------------------
只是使用与数字类型,他可以为指定的键对应的数字类型的数值进行加减操作
$inc
{$inc:{key:value}}
## ----------------------
它的用法很简单,就是删除指定的键
$unset
{$unset:{key:value}}
## ----------------------
1.如果指定的键是数组增追加新的数值
2.如果指定的键不是数组则中断当前操作Cannot apply $push/$pushAll modifier to non-array
3.如果不存在指定的键则创建数组类型的键值对
$push
{$push:{key:value}}
## ----------------------
用法和$push相似它可以体谅添加数组数据
$pushAll
{$pushAll:{key:value}}
## ----------------------
目标数组存在此项则不操作,不存在此项则加进去
$addToSet
{$addToSet:{key:value}}
## ----------------------
从指定数组删除一个值1删除最后一个数值,-1删除第一个数值
$pop
{$pop:{key:value}}
## ----------------------
删除一个被指定的数值
$pull
{$pull:{key:value}}
## ----------------------
一次性删除多个指定的数值
$pullAll
{$pullAll:{key:value}}
## ----------------------
1.数组定位器,如果数组有多个数值我们只想对其中一部分进行操作我们就要用到定位器($)
例子:
例如有文档{name:”YFC”,age:27,books:[{type:’JS’,name:”EXTJS4”},{type:”JS”,name:”JQUERY”},{type:”DB”,name:”MONGODB”}]}
我们要把type等于JS的文档增加一个相同的作者author是USPCAT
办法:
db.text.update({"books.type":"JS"},{$set:{"books.$.author":"USPCAT"}})
## ----------------------
$addToSet与$each结合完成批量数组更新
db.text.update({_id:1000},{$addToSet:{books:{$each:[“JS”,”DB”]}}})
$each会循环后面的数组把每一个数值进行$addToSet操作
## ----------------------
存在分配与查询效率
当document被创建的时候DB为其分配没存和预留内存当修改操作,不超过预留内层的时候则速度非常快反而超过了就要分配新的内存,则会消耗时间
--------------------=========---查询条件----------=======-------------------------------
$lt【<,例如:{age:{$gte:22,$lte:27}}】
$lte【<=】
$gt【>】
$gte【>=】
$ne【!=,例如:{age:{$ne:26}}】
$in【包含,例如:db.persons.find({country:{$in:["USA"]}},{_id:0,country:1});】
$nin【不包含,例如:db.persons.find({country:{$nin:["USA"]}},{_id:0,country:1});】
$or【or查询,例如:db.persons.find({$or:[{c:{$gt:85}},{e:{$gt:90}}]},{_id:0,c:1,e:1});】
null【查询值为null的数据,例如:db.persons.find({sex:{$in:[null]}},{_id:0,country:1});】
正则查询【例如:db.persons.find({name:/li/i},{_id:0,name:1});】
$not【查询任何地方进行取反操作,例如:db.persons.find({name:{$not:/li/i}},{_id:0,name:1});】
$all【数组查询,例如:db.persons.find({books:{$all:["JS","MONGODB"]}},{_id:0,name:1});】
$slice【查询文档中指定数组的内部值】
$where【查询复杂的查询可以使用,但是性能不好】
limit【返回指定的数据条数,例如:db.persons.find({},{_id:0,name:1}).limit(5);】
skip【返回指定数据的跨度(分页查询),例如:db.persons.find({},{_id:0,name:1}).skip(0).limit(3);】
sort【排序(1为正序,-1为倒序),例如:db.persons.find({},{_id:0,age:1}).skip(0).limit(6).sort({age:-1});】
count【查询个数,例如:db.persons.find({country:"USA"}).count();】
--------------------------索引--------------------------------------
ensureIndex【创建索引(1为正序索引,-1为倒序索引),例如:db.text.ensureIndex({number:-1});】
unique【唯一索引,例如:db.text.ensureIndex({name:-1},{unique:true});】
dropDups【创建索引删除重复值,例如:db.text.ensureIndex({name:-1},{unique:true,dropDups:true});】
hint【根据指定索引进行查询数据(指定的索引必须是已经创建好的索引),例如:db.text.find({number:123123}).hint({number:1});】
explain【查看本次查询使用哪个索引和查询数据状态信息(cursor:使用的索引,nscanned:查到几个文档,millis:查询时间),例如:db.text.find({number:123123}).explain();】
system.indexes【查看数据库已经建立的索引,例如:db.system.indexes.find();db.system.namespaces.find();】
background【执行创建索引的过程会暂时锁表(后台执行),例如:db.text.ensureIndex({name:-1},{background:true});】
runCommand【删除索引,例如:db.runCommand({dropIndexes:"text",index:"name_-1"});】
【添加2D索引,例如:db.map.ensureIndex({"gis":"2d"},{min:-1,max:201});】
db.map.find({gis:{"$within":{$box:[[50,50],[190,190]]}}},{_id:0,gis:1});【查询以点(50,50)和点(190,190)为对角线的正方形中的所有的点】
db.map.find({gis:{$within:{$center:[[56,80],50]}}},{_id:0,gis:1});【查询出以圆心为(56,80)半径为50规则下的圆心面积中的点】
-------------------------------mongo固定集合-------------------------------------------
db.createCollection("mycoll",{size:100,capped:true,max:10});【创建一个新的固定集合要求大小是100字节,可以存储文档10个】
db.runCommand({convertToCapped:"name",size:10000});【把一个普通集合转换成固定集合】
db.mycoll.find().sort({$natural:-1});【查询固定集合mycoll并且反响排序】
--------------------------服务器端脚本------------------------------------------------
db.eval("function(name){return name}","helloworld");【服务器端运行eval】
--------------------------mongo启动配置详讲------------------------------------------------
1.启动项mongo --help
--dbpath【指定数据库的目录,默认在windows下是c:\data\db\】
--port【指定服务器监听的端口号码,默认是27017】
--fork【用守护进程的方式启动mongoDB】
--logpath【指定日志的输出路径,默认是控制台】
--config【指定启动项用文件的路径】
--auth【用安全认证方式启动数据库】
--------------------------用户管理,安全认证------------------------------------------------
db.addUser("admin":"123456");【添加一个用户】
db.auth("admin":"123456");【启用用户】
db.system.users.remove({"user":"admin"});【用户删除操作】
--auth【安全检查】
-----------------------------主从复制---------------------------------------------
--master【用来确定主服务器】
--slave【控制从服务器】
--source【控制从服务器】
-----------主配置----------------
dbpath = D:\sortware\mongod\01\8888 主数据库地址
port = 8888 主数据库端口号
bind_ip = 127.0.0.1 主数据库所在服务器
master = true 确定我是主服务器
------------从配置---------------------
dbpath = D:\sortware\mongod\01\7777 从数据库地址
port = 7777 从数据库端口号
bind_ip = 127.0.0.1 从数据库所在服务器
source = 127.0.0.1:8888 确定我数据库端口
slave = true 确定自己是从服务器
2.主从复制的其他设置项
--only 从节点?指定复制某个数据库,默认是复制全部数据库
--slavedelay 从节点?设置主数据库同步数据的延迟(单位是秒)
--fastsync 从节点?以主数据库的节点快照为节点启动从数据库
--autoresync 从节点?如果不同步则从新同步数据库
--oplogSize 主节点?设置oplog的大小(主节点操作记录存储到local的oplog中)
3.利用shell动态添加和删除从节点
不难看出从节点中关于主节点的信息全部存到local的sources的集合中
我们只要对集合进行操作就可以动态操作主从关系
挂接主节点:操作之前只留下从数据库服务
db.sources.insert({“host”:”127.0.0.1:8888”})
删除已经挂接的主节点:操作之前只留下从数据库服务
db.sources.remove({“host”:”127.0.0.1:8888”})