连接数据库:
mongo 数据库名不填数据库,名默认为test
常用命令:
show dbs;显示出可用数据库的名称
show collections;显示出当前数据库中的集合
show users;显示出当前数据库中的用户
use 切换当前正在使用的数据库
管理员执行命令:
db.adminCommand({"命令","value"})
创建集合:
db.createCollection("集合名");
db.createCollection("集合名",capped:true,size:number,max:number)
创建固定集合,capped 是否固定集合;size文档存储大小,单位为字节;max为文档最大数量,number为整数,无论哪个先达到限制都会删除最先的文档
查看当前数据库现有集合:
db.getCollectionNames();
访问已经创建的集合
db.CollectionName;
查询文档:
db.集合名.find()返回一个集合,需要下标引用
db.集合名.findOne()仅查看第一个符合条件的文档
创建集合:
db.createCollection("collectionName");
删除集合:
db.collectionName.drop();
db.runCommand({"drop":"collectionName"})
添加文档:
var obj = {"key1":111,"key2":222};
db.集合名.insert(obj);
更新文档:
print(book);//可省略
book.comments=[];
删除文档:
MongoDB数据类型:
String包含一串文本,用于存储文本值。使用utf-8编码
Booleanflase 和 true
数值类型:
Double用于存储浮点数,shell默认使用64位浮点数存储数值
Integer(32位和64位)
用于存储整数
Array用于存储数组
Object用于存储内嵌文档,内嵌文档作为父文档
Null专门表示空值
Date存储1970年1月1日点
连接数据库:
mongo ip或主机名:port/数据库名
无连接启动
mongo -nodb;
无连接启动后,手动链接数据库
conn=new Mongo("ip或主机名:prot")
db=conn.getDB("数据库名")
执行脚本
mongo ip/主机名:prot/数据库名 js文件路径
sheel对应的javascript函数
use db ---->db.getSisterDB("db")
show dbs--->db.getMongo().getDBs()
show collectionsdb.getCollectionNames()
使用脚本注入变量和函数
在连接sheel后使用load(src)
创建新数据库:
use databaseName
db.createCollection("myName");
ps:只有往数据库里面添加一条数据新的数据库才会创建
删除数据库:
db.dorpDatabase();
在mongoSheel中加载js文件:load("path")
查找:
比较操作符 : $lt,$lte,$gt,$gte,$eq ,等操作符分别对应 , >= , =
用法: find(})
$in , 专门匹配一个键的值是否为指定的多个被选值中的一个 , 用法: find({ 键:{ $in : [值1,值2,值3,...] } })
$nin, 专门匹配一个键的值是否不在指定的多个被选值列表中, 用法如上。
$and , 专门匹配一个条件数组中的所有条件,用法 : find({$and:[{,,键:值},...]})
$or , 专门匹配一个条件数组中的任意一个条件,用法 : find({$or:[{,,键:值},...]})
$not , 可用在任意条件前,匹配不满足指定条件的文档 , 用法: find({ 键:{$not:} })
值为null,同时兼具两层意思:键的值等于null,或者键不存在
$exists , 专门用于判断指定键是否存在,用法: find({ 键:{ $eq:null, $exists:true }});
find({"键.i":值}) ; 匹配数组指定位置的值
$all , 专门比较一个数组类型的键中是否包含所有指定元素, 用法: find(})
$size , 查询特定长度的数组,用法: find(}) ,ps:$size 不支持比较操作符
$slice , find函数第二个参数 , 专门用于截取返回数组中指定位置的子数组, 用法: find(,}) ; ps: 特殊用法: find(,}) ,截取开头的n个元素 ; find(,}) , 截取结尾的n个元素
注意:
$gt或者$lt在比较数组时,$gt或$lt同样也会比较数组中的元素,并且还是用OR的关系
解决1: $elemMatch, 专门用于要求必须用两个边界条件,同事匹配一个数组元素,且只能匹配数组元素,用法: find(}})
解决2:利用查询结果的min和max函数,但查询建上必须创建索引才可用, 用法: find({}).min().max() , ps: min和max比$比较符效率高
更新修改器:
update:
$set:标识修改已有的键的值,用法: db.collectionName.update(,{$set:})
$inc:专门用于增加或减少一个键的值,通常用于需要累加或者不断增减的值,只能用于整数和浮点数,不能用于其他类型,用法: db.collectionName(,{$inc:})
$push:用于向数组中追加一个新元素,如果数组不存在则创建数组,用法:db.collectionName.update(,{$push:});
$each:相当于散列,把值打散一个一个复制到value中,常用于数组修改$push,用法:db.collectionName.update(,{$push:}})
$slice:专门用于截取数组中指定个数的元素长度,n为正数时从数组前面截取,负数时从数组尾部截取,用法:db.collectionName.update(,{$push:}})
$sort:专门用于,在最佳新数组元素厚,对数组内容排序,n为1则为升序,n为-1则为降序,用法:db.collectionName.update(,{$push:}})
$ne:用于判定数组中是否已经包含了指定元素,只有数组中不含有指定元素才会把指定元素添加到数组中,用法:db.collectionName.update({ base:val,key:{$ne:value}},{$push:});
$addToSet:用法和$push一样,但$addToSet只添加数组中不存在的元素,用法: db.collectionName.update(,{$addToSet:}})
$pop:专门用于从数组的开头或者结尾删除一个元素,n为1则表示删除结尾最后一个元素,为-1则删除开头的第一个元素,用法:db.collectionName.update(,{$pop:})
$pull:专门用于删除数组中所有指定内容匹配的元素,用法:db.collectionName.update(,{$pull:});
upsert:
$setOnInsert:在upsert插入时,补充缺少的键,可以同时使用$setOnInsert修改器,用法:db.collectionName.update(,},true);
匹配内嵌文档: find({ "键.内嵌文档键":值 })
$where,万能匹配,但不安全,甚至需要禁用,执行效率慢并且不能使用索引,用法:
db.collectionName.find({$where:function(){
获取当前文档对象(this)
根据判断条件,返回true,达到选择符合条件的元素的目的
}});
查询并修改:
db.collectionName.findAndModify({
query:,
sort:,
update:,
new:true,//但会修改后的新文档
})
原子操作,避免竞态
数组操作:
key="arr.num",num为数字或者键名
upsert
update还有第三个参数,意为upsert,表示更新或者插入的已死,默认为false,表示不自动创建。设置upsert:db.collectionName.update(,true});
save
只要希望将文本整体更新回集合时,也启用upsert方式,就可以用save函数优化代码,用法:db.collectionName.save(obj);
原理:如果要保存的文档包含_id,则使用_id查找是否已存在,然后执行并设置upsert,如果文档不包含_id,则执行insert操作,直接插入文档
查询最后一次操作的信息:db.runCommand();
updateMany
update的第四个参数,如果将update的第四个参数设置为true,则开启修改多条记录方式,用法:db.collectionName.update(,,true,true);
findAndModify
可以一句话完成查找和修改功能,避免竞态。用法:db.findAndModify{ query:,sort:,update: };
findAndModify可以返回更新命令的旧值,可设置返回新的值,需在findAndModify中添加new:true
查询文档
find函数查询文档中的简直不能引用文档内的另一个键值,例如:
find函数的第二个参数,指定要返回的键值,其中值为1的键,表示要返回的。值为0表示不返回的,例如: find(,{ key:1,key:0 })
比较运算符: $lt=> 少于 ,$lte=> 少于等于 ,$gt=> 大于 ,$gte=> 大于等于 ,$eq=> 等于 , $ne =>不等于
OR查询:$in,专门匹配一个值是否为指定的多个被被选值中的一个;$nin,专门匹配一个键的值是否不在指定的备选列表中;用法:find(key : { $in / $nin : [ value1 , value2 .....]})
查询选项:
db.collectionName.find()._addSpecial("name":n);
name: $maxScan,仅在前n个文档内扫描符合条件的文档,查询效率高,单可能不完整
#min/$max,相当于$gt,$lt,后跟一个键值对
游标:
var cursor = db.collectionName.find();
cursor.hasNext();判断有没下一条
cursor.next();获取下一条
cursor.forEach(function(value))游标遍历函数
cursor.immortal()告诉服务器不要让游标超时,但必须遍历完才能自动释放
索引:
db.collectionName.ensureIndex({"key":1/-1})
其中1标识索引中键的值按升序排序,降序为-1
db.collectionName.ensureIndex({"数组键.内嵌文档的键":1});
内嵌文档索引
db.collectionName.getIndexes();
查看集合内的键建立的索引
db.collectionName.dropIndex("key");
删除key键的索引
db.collectionName.ensureIndex({"key":1/-1},)
唯一索引
db.collectionName.ensureIndex({"key":1/-1},)
稀疏索引,如果插入文档中不包含索引的键,则该文档不在加入到索引中
{
unnique:true,//建立唯一索引
sparse:true,//建立稀疏索引
name:"name",//自定义索引名,默认索引名:键_排序方向_键2_排序方向
background:true,//以后台方式建立索引,不影响正常插入修改删除等操作
}
常用:
var col = db.collectionName.find();
col.explain("executionStats"),专门用于显示一个查询的计划和执行时间
totalDocsExamined属性:扫描文档总数
executionTimeMillis属性:查询小号的毫秒数
查询返回仅需要的键:
db.collectionName.find(,)
1为返回,0为不返回,_id默认返回
查看操作信息
db.runCommand(option)
option:
getLastError:1, 查看最后一次操作的信息
领取专属 10元无门槛券
私享最新 技术干货