首页 > 技术文章 > MongoDB教程之常用操作

maomao999 2018-09-13 16:23 原文

公司某些数据要用到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);}

 

推荐阅读