公司某些数据要用到MongoDB进行存储,主要目的是为了查询比较方便,此次可谓是混合数据库使用的首例了。
在学习之前,要了解掌握一个非常重要的东西,那就是MongoDB与JavaScript的完美结合,嗯,这句话是非常重要的,后面慢慢体会,下面具体介绍MongoDB的常用操作。
基础操作
mongo 进入MongoDB命令行客户端
cls 清除当前命令行客户端内容
show dbs 列出所有的数据库
show databases 列出所有的数据库
use mldn 切换数据库,此处mldn只是随意取的数据库名称,此切换可以随意切换到没有创建的数据库中,一旦添加数据,此数据库会跟随创建。必须。
db.dropDatabase() 删除当前数据库
db.dropDatabase('mldn') 删除指定数据库
db.createCollection('tmp') 创建集合,相当于数据库中创建表,非必须
db.getCollection('tmp') 拿到集合,相当于拿到表在进行操作,非必须,学习时可省略
show collections 查看所有集合,查看所有表
db.tmp.drop() 删除名为tmp的集合(表)
db.getCollection('tmp') 删除名为tmp的集合(表)
增加、插入数据
db.tmp.insert({json对象});//单条插入
db.tmp.insert([{json对象},{}]);//批量插入
//db.tmp.insert({姓名: “张三“,sex:1,age:19});
删除
db.tmp.remove({json对象,部分条件});
//db.tmp.remove({age:19});
查询
db.tmp.find(); 查询所有
db.tmp.findOne(); 查看一个
查询核心语法:db.集合名称.find({查询条件}[,{设置显示的字段}])[.pretty()];//美化操作可选
//db.tmp.find({url:"mldn-14"},{_id:0}).pretty() //_id对应的值为0不显示,为1表示显示
// db.tmp.findOne({url:"mldn-14"},{_id:0})//无pretty()
关系运算
大于($gt)、小于($lt)、大于等于($gte)、小于等于($lte)、等于($eq)
//db.tmp.find({age:{"$gt":1,"$lt":99}}).pretty();
不是($ne)
//db.tmp.find({age:{“$ne”:99}});
逻辑运算
与($and)、或($or)、非($not、$nor)、
//db.tmp.find({age:{‘$gte’:19,’$lte’:20}}).pretty();
//db.tmp.find({age:{‘$not’:19}})(错误)
//db.tmp.find({age:{‘$ne’: 19}});
//db.tmp.find({‘$or’:[{age:{‘$gt’:19}},{score:[‘$lt’:90]}]})//或者
//db.tmp.find({‘$nor’:[{age:{‘$gt’:19}},{score:[‘$lt’:90]}]})//或者取反
求模($mod)
//db.tmp.fiind({age:{‘$mod’:[20,1]}})//年龄除以20余1的数据 求模
范围查询
在范围之中($in)、不在范围之中($nin)
// db.tmp.find({age:{'$in':[1,2,3,4,5]}})在范围
// db.tmp.find({age:{'$nin':[1,2,3,4,5]}})不在范围
数组查询
//db.tmp.insert({name:'大神11',age:11,course:['语文','数学','英语']})
//db.tmp.insert({name:'大神11',age:11,course:['数学','英语']})
//db.tmp.insert({name:'大神11',age:11,course:['语文','英语']})
数组操作符:$all、$size、$sliice、$elemMatch
//同时参加语文和数学的人
//db.tmp.find({'course':{'$all':['语文','数学']}})//查询课程中包含语文和数学的
//db.tmp.find({name:{'$all':['大神11']}})//查询名字为大神11的
数组使用索引操作
//db.tmp.find({'course.1':'英语'})//查询课程数组索引为1的课程为英语的
数组长度查询
//db.tmp.find({'course':{'$size':2}})//查询课程选择了两门的
//db.tmp.find({'course':{'$size':2}},{course:{'$slice':[1,1]}})返回数组指定长度数据
//[1,1] //从数组1开始,长度为1
嵌套查询
//db.tmp.insert({name:'11',age:11,course:['语文','数学','英语'],parents:[{name:'father',age:50,job:'工人'},{name:'mother',age:50,job:'工人2'}]})
//db.tmp.insert({name:'13',age:11,course:['数学','英语'],parents:[{name:'father',age:52,job:'处长'},{name:'mother',age:46,job:'工人aa'}]})
//db.tmp.insert({name:'12',age:11,course:['语文','英语'],parents:[{name:'father',age:53,job:'局长'},{name:'mother',age:30,job:'工人啊啊'}]})
//db.tmp.find({age:{'$gte':11},parents:{'$elemMatch':{'job':'局长'}}}).pretty();
判断某个字段是否存在 ($exists)
//db.tmp.find({age:{'$gte':11},parents:{'$exists':true}});//查询具有parents值的对象
//db.tmp.find({age:{'$gte':11},parents:{'$exists':false}});//查询不具有parents的对象
条件过滤 ($where)不能使用到索引,这个是JavaScript操作。
//db.tmp.find({'$where':'this.age>=11'});
//db.tmp.find(‘this.age>=11’)//where 的简化
// db.tmp.find({‘$where’:function(){return this.age>=11;}})
// db.tmp.find(function(){return this.age>=11;})
// db.tmp.find({'$and':[{'$where':'this.age>=11'},{'$where':'this.age<21'}]})
正则查询
正则使用Perl兼容的额正则表达式形式。
基础语法:{key:正则标记}
完整语法:{key:{‘$regex’:正则标记,’$options’:选项}}
options的值
i:忽略字母大小写
m:多行查找
x:空白字符串除了被转义的,或在字符类中意外的完全忽略
s:匹配所有的字符(圆点、‘.’),包括换行呢而
如果直接诶使用(JavaScript),那么只能使用i和m,而x和s则必须使用’$regex’
//db.tmp.find({name:/神/}) // like ‘%神%’
// db.tmp.find({name:/a/i}) // like ‘%a%’ or like ‘%A%’
// db.tmp.find({name:{'$regex':/神/}})
// db.tmp.find({name:{'$regex':/神/}})
// db.tmp.find({name:{'$regex':/a/,'$options':'i'}})
MongoDB中的正则与java的正则有区别。
排序
排序函数($sort())、升序(1)、降序(-1)
自然排序,按照数据保存的先后排序($natural)
//db.tmp.find().sort({age:1}).pretty();
// db.tmp.find().sort({'$natural':-1}).pretty();
分页
skip(n)跳过多少条记录
limit(n)每次取多少条记录
//db.tmp.find().skip(0).limit(5).sort({'age':-1}).pretty();
count()查询总数
//db.tmp.find({条件}).count();
//db.tmp.count({条件},{参数});
参数: limit:限制最大数量
skip:跳过数量
hint:索引名称
maxTimeMS:允许查询的最大时间,单位ms
readConcern:读取级别
数据更新
update():db.集合.update(更新条件,新的对象数据(更新操作符),upsert,multi);
upsert:如果更新的数据不存在,则增加一条记录(true为增加,false为不增加)
multi:表示是否只更新满足条件的第一行记录。如果设置为false,只更新第一条记录,为true,更新所有满足条件的记录。
需要配合 $set 使用
//db.tmp.update({age:11},{score:100},false,false); //出错啦,插入了一条记录
//db.tmp.update({age:6},{'$set':{score:98}},true,true);//插入了一条记录
//db.tmp.update({age:11},{'$set':{score:100}},false,false); 更新了第一条
//db.tmp.update({age:11},{'$set':{score:99}},true,false);//更新了第一条
//db.tmp.update({age:11},{'$set':{score:99}},true,true);//更新了所有
save():能更新能保存,但需要使用到id才可以
// db.tmp.save({age:6},{score:50}); 无效
// db.tmp.save({age:6},{'$set':{score:50}}); 无效
// db.tmp.save({ "_id" : ObjectId("5b98f7b93ce9c84291fee093"),score:50});//根据id修改,并且是所有数据全部覆盖
修改器
$inc:主要针对一个数字字段,增加某个数字字段的数据内容
基本语法:db.集合.update({条件},{‘$inc’:{key:changeValue}})
//db.tmp.update({age:11},{'$inc':{score:99}},true,true);给满足条件的值+99分
$set:进行内容的重新设置
基本语法:db.集合.update({条件},{‘$inc’:{key:value}})
// db.tmp.update({age:11},{'$set':{score:99}},true,true);//更新了所有分值为99分
$unset:删除某个成员的内容
基本语法:db.集合.update({条件},{‘$unset’:{key:1}})
// db.tmp.update({age:11},{'$unset':{score:99}},true,true);//成功删除满足条件的分数字段
$push:相当于将内容追加到指定的成员之中(基本上是数组),追加的内容为数组成员,每次只能追加一个值。如果没有对应字段,则会添加对应的字段
基本语法:db.集合.update({条件},{‘$push’:{key:value}})
//db.tmp.update({age:11},{'$push':{score:99}},true,true);//如果已经存在,但不是数组,则不会追加
// db.tmp.update({age:11},{'$push':{score:[1,3,5,7]}},true,true); //会将整个数组作为数组值进行追加,需要注意。
$pushAll:与 $push 类似,可以一次追加多个内容到数组里面。mongoDB在3.6已经取消了此功能,将此功能合并到了 $push 中。
基本语法:db.集合.update({条件},{‘$push’:{key:[数组成员]}})
// db.tmp.update({age:11},{'$pushAll':{score:[1,3,5,7]}});
$addToSet:想数组里面增加新的内容,只有这个内容不存在才会增加
基本语法:db.集合.update({条件},{‘$addToSet’:{key:value}})
//db.tmp.update({age:11},{'$addToSet':{score:1}},true,true);
$pop:删除数组内的数据
基本语法:db.集合.update({条件},{‘$pop’:{key:value}}),内容如果设置为-1表示删除第一个,如果是1表示删除最后一个。
//db.tmp.update({age:11},{'$pop':{score:1}},true,true);//删除最后一个
$pull:从数组内删除一个指定内容的数据
基本语法:db.集合.update({条件},{‘$pull’:{key:value}}),进行数据比对,如果能对比上,则删除
// db.tmp.update({age:11},{'$pull':{score:1}},true,true);//跟单个值
$pullAll:一次删除多个内容
基本语法:db.集合.update({条件},{‘$pullAll’:{key:value}})
// db.tmp.update({age:11},{'$pullAll':{score:[1,3,5,7]}},true,true);//跟数组
$rename:为成员名称重命名
基本语法:db.集合.update({条件},{‘$rename’:{key:value}})
删除数据
remove({条件},option):删除对应的数据,条件支持正则
option:false,删除所有满足条件的数据,true,只删除第一个满足条件的数据
基本语法:db.集合.remove({条件},是否删除第一个);
//db.tmp.remove({});//删除所有
//db.tmp.drop();
游标
find():返回了一个游标
判断是否有下一行数据:hasNext()
取出当前数据:next()
// var cursor=db.tmp.find();while(cursor.hasNext()){var doc=cursor.next();print(doc);}
// var cursor=db.tmp.find();while(cursor.hasNext()){var doc=cursor.next();printjson(doc);}