Mongodb命令

Mongodb如:创建 “myTest”的数据库,先运行usemyTest命令,这样就可以创建一个名叫“myTest”的数据库。

一、数据库常用命令

1、Help查看命令提示

help

db.help();

db.yourColl.help();

db.youColl.find().help();

rs.help();

2、切换/创建数据库

useyourDB; 当创建一个集合(table)的时候会自动创建当前数据库

3、查询所有数据库

showdbs;

4、删除当前使用数据库

db.dropDatabase();

5、从指定主机上克隆数据库

db.cloneDatabase(“127.0.0.1”); 将指定机器上的数据库的数据克隆到当前数据库

6、从指定的机器上复制指定数据库数据到某个数据库

db.copyDatabase("mydb","temp", "127.0.0.1");将本机的mydb的数据复制到temp数据库中

7、修复当前数据库

db.repairDatabase();

8、查看当前使用的数据库

db.getName();

db; db和getName方法是一样的效果,都可以查询当前使用的数据库

9、显示当前db状态

db.stats();

10、当前db版本

db.version();

11、查看当前db的链接机器地址

db.getMongo();

二、Collection聚集集合

1、创建一个聚集集合(table)

db.createCollection(“collName”, {size: 20,capped: 5, max: 100});//创建成功会显示{“ok”:1}

//判断集合是否为定容量db.collName.isCapped();

2、得到指定名称的聚集集合(table)

db.getCollection("account");

3、得到当前db的所有聚集集合

db.getCollectionNames();

4、显示当前db所有聚集索引的状态

db.printCollectionStats();

三、用户相关

1、添加一个用户

db.addUser("name");

db.addUser("userName","pwd123", true); 添加用户、设置密码、是否只读

2、数据库认证、安全模式

db.auth("userName","123123");

3、显示当前所有用户

show users;

4、删除用户

db.removeUser("userName");

四、聚集集合查询

1、查询所有记录

db.userInfo.find();

相当于:select* from userInfo;

默认每页显示20条记录,当显示不下的情况下,可以用it迭代命令查询下一页数据。注意:键入it命令不能带“;”

但是你可以设置每页显示数据的大小,用DBQuery.shellBatchSize= 50;这样每页就显示50条记录了。

2、查询去掉后的当前聚集集合中的某列的重复数据

db.userInfo.distinct("name");

会过滤掉name中的相同数据

相当于:select distict name from userInfo;

3、查询age = 22的记录

db.userInfo.find({"age":22});

相当于: select * from userInfo where age = 22;

4、查询age > 22的记录

db.userInfo.find({age:{$gt: 22}});

相当于:select * from userInfo where age >22;

5、查询age < 22的记录

db.userInfo.find({age:{$lt: 22}});

相当于:select * from userInfo where age <22;

6、查询age >= 25的记录

db.userInfo.find({age:{$gte: 25}});

相当于:select * from userInfo where age >= 25;

7、查询age <= 25的记录

db.userInfo.find({age:{$lte: 25}});

8、查询age >= 23 并且 age <=26

db.userInfo.find({age:{$gte: 23, $lte: 26}});

9、查询name中包含 mongo的数据

db.userInfo.find({name:/mongo/});

//相当于%%

[code]select* from userInfo where name like ‘%mongo%';

10、查询name中以mongo开头的

db.userInfo.find({name:/^mongo/});

select * from userInfo where name like‘mongo%';

11、查询指定列name、age数据

db.userInfo.find({},{name: 1, age: 1});

相当于:select name, age from userInfo;

当然name也可以用true或false,当用ture的情况下河name:1效果一样,如果用false就是排除name,显示name以外的列信息。

12、查询指定列name、age数据, age >25

db.userInfo.find({age:{$gt: 25}}, {name: 1, age: 1});

相当于:select name, age from userInfo where age >25;

13、按照年龄排序

升序:db.userInfo.find().sort({age:1});

降序:db.userInfo.find().sort({age:-1});

14、查询name = zhangsan,age = 22的数据

db.userInfo.find({name:'zhangsan', age: 22});

相当于:select * from userInfo where name = ‘zhangsan' and age = ‘22';

15、查询前5条数据

db.userInfo.find().limit(5);

相当于:selecttop 5 * from userInfo;

16、查询10条以后的数据

db.userInfo.find().skip(10);

相当于:select * from userInfo where id not in (

selecttop 10 * from userInfo);

17、查询在5-10之间的数据

db.userInfo.find().limit(10).skip(5);

可用于分页,limit是pageSize,skip是第几页*pageSize

18、or与 查询

db.userInfo.find({$or:[{age: 22}, {age: 25}]});

相当于:select * from userInfo where age = 22 or age = 25;

19、查询第一条数据

db.userInfo.findOne();

相当于:selecttop 1 * from userInfo;

db.userInfo.find().limit(1);

20、查询某个结果集的记录条数

db.userInfo.find({age:{$gte: 25}}).count();

相当于:select count(*) from userInfo where age >= 20;

21、按照某列进行排序

db.userInfo.find({sex:{$exists: true}}).count();

相当于:select count(sex) from userInfo;

五、索引

1、创建索引

db.userInfo.ensureIndex({name:1});

db.userInfo.ensureIndex({name:1, ts: -1});

2、查询当前聚集集合所有索引

db.userInfo.getIndexes();

3、查看总索引记录大小

db.userInfo.totalIndexSize();

4、读取当前集合的所有index信息

db.users.reIndex();

5、删除指定索引

db.users.dropIndex("name_1");

6、删除所有索引索引

db.users.dropIndexes();

六、修改、添加、删除集合数据

1、添加:db.users.insert({name:“zhao” });            //单引号也可以

db.users.save({name: ‘zhangsan', age: 25,sex: true});

添加的数据的数据列,没有固定,根据添加的数据为准

2、修改

db.users.update({age:25}, {$set: {name: 'changeName'}}, false, true);

相当于:update users set name = ‘changeName' whereage = 25;

db.users.update({name:'Lisi'}, {$inc: {age: 50}}, false, true);

相当于:update users set age = age + 50 where name = ‘Lisi';

db.users.update({name:'Lisi'}, {$inc: {age: 50}, $set: {name: 'hoho'}}, false, true);

相当于:update users set age = age + 50, name = ‘hoho' wherename = ‘Lisi';

3、删除

db.users.remove({age:132});

4、查询修改删除

db.users.findAndModify({

   query: {age: {$gte: 25}},

   sort: {age: -1},

   update: {$set: {name: 'a2'}, $inc: {age: 2}},

   remove: true

});

db.runCommand({ findandmodify :"users",

   query: {age: {$gte: 25}},

   sort: {age: -1},

   update: {$set: {name: 'a2'}, $inc: {age: 2}},

   remove: true

});

update 或 remove 其中一个是必须的参数; 其他参数可选。

参数    详解     默认值

query    查询过滤条件    {}

sort    如果多个文档符合查询过滤条件,将以该参数指定的排列方式选择出排在首位的对象,该对象将被操作    {}

remove    若为true,被选中对象将在返回前被删除    N/A

update    一个 修改器对象

N/A

new    若为true,将返回修改后的对象而不是原始对象。在删除操作中,该参数被忽略。    false

fields    参见Retrieving a Subsetof Fields (1.5.0+)

Allfields

upsert    创建新对象若查询结果为空。 示例 (1.5.4+)

false

七、语句块操作

1、简单Hello World

print("Hello World!");

这种写法调用了print函数,和直接写入"Hello World!"的效果是一样的;

2、将一个对象转换成json

tojson(new Object());

tojson(new Object('a'));

3、循环添加数据

> for (var i = 0; i < 30; i++) {

... db.users.save({name: "u_" +i, age: 22 + i, sex: i % 2});

... };

这样就循环添加了30条数据,同样也可以省略括号的写法

代码如下:

> for (var i = 0; i < 30; i++)db.users.save({name: "u_" + i, age: 22 + i, sex: i % 2});

也是可以的,当你用db.users.find()查询的时候,显示多条数据而无法一页显示的情况下,可以用it查看下一页的信息;

4、find 游标查询

>var cursor = db.users.find();

> while (cursor.hasNext()) {

   printjson(cursor.next());

}

这样就查询所有的users信息,同样可以这样写

var cursor = db.users.find();

while (cursor.hasNext()) {printjson(cursor.next); }

同样可以省略{}号

5、forEach迭代循环

db.users.find().forEach(printjson);

forEach中必须传递一个函数来处理每条迭代的数据信息

6、将find游标当数组处理

var cursor = db.users.find();

cursor[4];

取得下标索引为4的那条数据

既然可以当做数组处理,那么就可以获得它的长度:cursor.length();或者cursor.count();

那样我们也可以用循环显示数据

for (var i = 0, len = c.length(); i <len; i++) printjson(c[i]);

7、将find游标转换成数组

> var arr = db.users.find().toArray();

> printjson(arr[2]);

用toArray方法将其转换为数组

8、定制我们自己的查询结果

只显示age <= 28的并且只显示age这列数据

db.users.find({age: {$lte: 28}}, {age: 1}).forEach(printjson);

db.users.find({age: {$lte: 28}}, {age:true}).forEach(printjson);

排除age的列

db.users.find({age: {$lte: 28}}, {age:false}).forEach(printjson);

9、forEach传递函数显示信息

db.things.find({x:4}).forEach(function(x){print(tojson(x));});

八、其他

1、查询之前的错误信息

db.getPrevError();

2、清除错误记录

db.resetError();

查看聚集集合基本信息

1、查看帮助  db.yourColl.help();

2、查询当前集合的数据条数  db.yourColl.count();

3、查看数据空间大小db.userInfo.dataSize();

4、得到当前聚集集合所在的dbdb.userInfo.getDB();

5、得到当前聚集的状态db.userInfo.stats();

6、得到聚集集合总大小db.userInfo.totalSize();

7、聚集集合储存空间大小db.userInfo.storageSize();

8、Shard版本信息  db.userInfo.getShardVersion()

9、聚集集合重命名db.userInfo.renameCollection("users"); 将userInfo重命名为users

10、删除当前聚集集合db.userInfo.drop();

show dbs:显示数据库列表

show collections:显示当前数据库中的集合(类似关系数据库中的表)

show users:显示用户

use <db name>:切换当前数据库,这和MS-SQL里面的意思一样

db.help():显示数据库操作命令,里面有很多的命令

db.foo.help():显示集合操作命令,同样有很多的命令,foo指的是当前数据库下,一个叫foo的集合,并非真正意义上的命令

db.foo.find():对于当前数据库中的foo集合进行数据查找(由于没有条件,会列出所有数据)

db.foo.find( { a : 1 } ):对于当前数据库中的foo集合进行查找,条件是数据中有一个属性叫a,且a的值为1

 

修改器名称

语法

案例

$set

{$set:{field: value}}

{$set:{name:”uspcat”}}

它用来指定一个键值对,如果存在键就进行修改不存在则进行添加.

$inc

{ $inc : { field : value } }

{ $inc : { "count" : 1 } }

只是使用与数字类型,他可以为指定的键对应的数字类型的数值进行加减操作.

 $unset

{ $unset : { field : 1} }

 { $unset : { “name":1 }

他的用法很简单,就是删除指定的键

 $push

{ $push : { field : value } }

{ $push : { books:”JS”}

1.如果指定的键是数组增追加新的数值

2.如果指定的键不是数组则中断当前操作Cannot apply $push/$pushAll modifier to non-array

3.如果不存在指定的键则创建数组类型的键值对

 $pushAll

{ $pushAll : { field : array } }

{ $push : { books:[“EXTJS”,”JS”]}

用法和$push相似他可以体谅添加数组数据

$addToSet

{ $addToSet: { field : value } }

{ $addToSet: { books:”JS”}

目标数组存在此项则不操作,不存在此项则加进去

$pop

{$pop:{field: value}}

{$pop:{name:1}} {$pop:{name:-1}}

从指定数组删除一个值1删除最后一个数值,-1删除第一个数值

$pull

{ $pull: { field : value } }

{ $pull : { “book" : “JS” } }

删除一个被指定的数值

 $pullAll

{ $pullAll: { field : array} }

 { $pullAll: { “name":[“JS”,”JAVA”] }

一次性删除多个指定的数值

 $

{ $push : { field : value } }

{ $push : { books:”JS”}

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"}})

     

*切记修改器是放到最外面,后面要学的查询器是放到内层的

mongodb.bat服务器

mongod --dbpath D:\Mongodbdata

mongodbclient.bat 客户端

mongo 127.0.0.1:27017/test

1.插入文档

           db.[documentName].insert({})

2.批量插入文档

    shell 这样执行是错误的 db.[documentName].insert([{},{},{},……..])

    shell 不支持批量插入想完成批量插入可以用mongo的应用驱动或是shell的for循环

3.Save操作

     save操作和insert操作区别在于当遇到_id相同的情况下save完成保存操作insert则会报错

1.删除列表中所有数据

           db.[documentName].remove()

        集合的本身和索引不会别删除

2.根据条件删除

    db.[documentName].remove({})

           删除集合text中name等于uspcat的纪录

     db.text.remove({name:”uspcat”})

3.小技巧

    如果你想清楚一个数据量十分庞大的集合直接删除该集合并且重新建立索引的办法比直接用remove的效率和高很多

1.强硬的文档替换式更新操作

           db.[documentName].update({查询器},{修改器})

        强硬的更新会用新的文档代替老的文档

2.主键冲突的时候会报错并且停止更新操作

        因为是强硬替换当替换的文档和已有文档ID冲突的时候则系统会报错

3.insertOrUpdate操作

        目的:查询器查出来数据就执行更新操作,查不出来就替换操作做法:db.[documentName].update({查询器},{修改器},true)

4.批量更新操作

        默认情况当查询器查询出多条数据的时候默认就修改第一条数据如何实现批量修改

        db.[documentName].update({查询器},{修改器},false, true)

6. $addToSet与$each结合完成批量数组更新

           db.text.update({_id:1000},{$addToSet:{books:{$each:[“JS”,”DB”]}}})

         $each会循环后面的数组把每一个数值进行$addToSet操作

7.存在分配与查询效率

            当document被创建的时候DB为其分配没存和预留内存当修改操作不超过预留内层的时候则速度非常快反而超过了就要分配新的内存则会消耗时间

6. runCommand函数和findAndModify函数

          runCommand可以执行mongoDB中的特殊函数

          findAndModify就是特殊函数之一他的用于是返回update或remove后的文档

         runCommand({“findAndModify”:”processes”,

        query:{查询器},

                   sort{排序},

                    new:true

                   update:{更新器},

                   remove:true

      }).value

       ps = db.runCommand({

              "findAndModify":"persons",

              "query":{"name":"text"},

                        "update":{"$set":{"email":"1221"}},

                         "new":true

         }).value

         do_something(ps)

1.指定返回的键

           db.[documentName].find ({条件},{键指定})

        数据准备persons.json

var persons = [{

         name:"jim",

         age:25,

         email:"75431457@qq.com",

         c:89,m:96,e:87,

         country:"USA",

         books:["JS","C++","EXTJS","MONGODB"]

},

{

         name:"tom",

         age:25,

         email:"214557457@qq.com",

         c:75,m:66,e:97,

         country:"USA",

         books:["PHP","JAVA","EXTJS","C++"]

},

{

         name:"lili",

         age:26,

         email:"344521457@qq.com",

         c:75,m:63,e:97,

         country:"USA",

         books:["JS","JAVA","C#","MONGODB"]

},

{

         name:"zhangsan",

         age:27,

         email:"2145567457@qq.com",

         c:89,m:86,e:67,

         country:"China",

         books:["JS","JAVA","EXTJS","MONGODB"]

},

{

         name:"lisi",

         age:26,

         email:"274521457@qq.com",

         c:53,m:96,e:83,

         country:"China",

         books:["JS","C#","PHP","MONGODB"]

},

{

         name:"wangwu",

         age:27,

         email:"65621457@qq.com",

         c:45,m:65,e:99,

         country:"China",

         books:["JS","JAVA","C++","MONGODB"]

},

{

         name:"zhaoliu",

         age:27,

         email:"214521457@qq.com",

         c:99,m:96,e:97,

         country:"China",

         books:["JS","JAVA","EXTJS","PHP"]

},

{

         name:"piaoyingjun",

         age:26,

         email:"piaoyingjun@uspcat.com",

         c:39,m:54,e:53,

         country:"Korea",

         books:["JS","C#","EXTJS","MONGODB"]

},

{

         name:"lizhenxian",

         age:27,

         email:"lizhenxian@uspcat.com",

         c:35,m:56,e:47,

         country:"Korea",

         books:["JS","JAVA","EXTJS","MONGODB"]

},

{

         name:"lixiaoli",

         age:21,

         email:"lixiaoli@uspcat.com",

         c:36,m:86,e:32,

         country:"Korea",

         books:["JS","JAVA","PHP","MONGODB"]

},

{

         name:"zhangsuying",

         age:22,

         email:"zhangsuying@uspcat.com",

         c:45,m:63,e:77,

         country:"Korea",

         books:["JS","JAVA","C#","MONGODB"]

}]

for(var i = 0;i<persons.length;i++){

         db.persons.insert(persons[i])

}

var persons = db.persons.find({name:"jim"})

while(persons.hasNext()){

         obj = persons.next();

        print(obj.books.length)

}

           1.1 查询出所有数据的指定键(name ,age,country)

                   db.persons.find({},{name:1,age:1,country:1,_id:0})

2.查询条件

        2.1查询出年龄在25到27岁之间的学生

      db.persons.find({age: {$gte:25,$lte:27},{_id:0,age:1})

      2.2查询出所有不是韩国籍的学生的数学成绩

      db.persons.find({country:{$ne:” Korea”}},{_id:0,m:1})

3.包含或不包含

      $in或$nin

      2.3查询国籍是中国或美国的学生信息

      db.persons.find({country:{$in:[“USA”,“China”]}})

      2.4查询国籍不是中国或美国的学生信息

      db.persons.find({country:{$nin:[“USA”,“China”]}})

4.OR查询

         $or

      2.4查询语文成绩大于85或者英语大于90的学生信息

     db.persons.find({$or:[{c:{$gte:85}},{e:{$gte:90}}]},{_id:0,c:1,e:1})

5.Null

     把中国国籍的学生上增加新的键sex

     db.person.update({country:”China”},{$set:{sex:”m”}})

     2.5查询出sex 等于 null的学生

      db.persons.find({sex:{$in:[null]}},{country:1})

6.正则查询

       2.6查询出名字中存在”li”的学生的信息

       db.persons.find({name:/li/i},{_id:0,name:1})

7.$not的使用

           $not可以用到任何地方进行取反操作

       2.7查询出名字中不存在”li”的学生的信息

       db.persons.find({name:{$not:/li/i}},{_id:0,name:1})

       $not和$nin的区别是$not可以用在任何地方儿$nin是用到集合上的

8.数组查询$all和index应用

         2.8查询喜欢看MONGOD和JS的学生

      db.persons.find({books:{$all:[“MONGOBD”,”JS”]}},{books:1,_id:0})

      2.9查询第二本书是JAVA的学习信息

      db.persons.find({“books.1”:”JAVA”})

9.查询指定长度数组$size它不能与比较查询符一起使用(这是弊端)

      2.8查询出喜欢的书籍数量是4本的学生

      db.persons.find({books:{$size:4}},{_id:0,books:1})

 2.9查询出喜欢的书籍数量大于3本的学生

      1.增加字段size

             db.persons.update({},{$set:{size:4}},false,true)

      2.改变书籍的更新方式,每次增加书籍的时候size增加1

          db.persons.update({查询器},{$push:{books:”ORACLE”},$inc:{size:1}})

      3.利用$gt查询

          db.persons.find({size:{$gt:3}})

      2.10利用shell查询出Jim喜欢看的书的数量

var persons =db.persons.find({name:"jim"})

while(persons.hasNext()){

         obj= persons.next();

       print(obj.books.length)

} 10.$slice操作符返回文档中指定数组的内部值

      2.11查询出Jim书架中第2~4本书

      db.persons.find({name:"jim"},{books:{"$slice":[1,3]}})

      2.12查询出最后一本书

     db.persons.find({name:"jim"},{books:{"$slice":-1},_id:0,name:1})

11.文档查询

     为jim添加学习简历文档 jim.json

var jim = [{

         school :"K",

         score:"A"

},{

         school :"L",

         score:"B"

},{

         school :"J",

         score:"A+"

}]

db.persons.update({name:"jim"},{$set:{school:jim}})

     2.13查询出在K上过学的学生

     1. 这个我们用绝对匹配可以完成,但是有些问题(找找问题?顺序?总要带着score?)

          db.persons.find({school:{school:"K",score:"A"}},{_id:0,school:1})

     2.为了解决顺序的问题我可以用对象”.”的方式定位

          db.persons.find({"school.score":"A","school.school":"K"},{_id:0,school:1})

     3.这样也问题看例子:

           db.persons.find({"school.score":"A","school.school":”J”},{_id:0,school:1})

         同样能查出刚才那条数据,原因是score和school会去其他对象对比

     4.正确做法单条条件组查询$elemMatch

          db.persons.find({school:{$elemMatch:{school:"K",score:"A"}}})

12.$where

     12.查询年龄大于22岁,喜欢看C++书,在K学校上过学的学生信息复杂的查询我们就可以用$where因为他是万能但是我们要尽量避免少使用它因为他会有性能的代价

db.persons.find({"$where":function(){

         //得到查询结果的每一条文档

         var books = this.books;

         //得到文档中的school对象

         var school = this.school;

         //如果年纪>=22

         if(this.age > 22){

                   var php = null;

                   //遍历书籍

                   for ( var i = 0; i < books.length; i++) {

                            if(books[i] == "C++"){

                                     php = books[i];

                                     //如果学校是真

                                     if(school){

                                               for (var j = 0; j < school.length; j++) {

                                                        //判断是不是在K上学

                                                        if(school[j].school == "K"){

                                                                 //返回是真

                                                                 return true;

                                                        }

                                               }

                                               break;

                                      }

                            }

                   }       

         }

}})

 

1.Limit返回指定的数据条数

1.1查询出

persons文档中前5条数据

   db.persons.find({},{_id:0,name:1}).limit(5)

2.Skip返回指定数据的跨度

    2.1查询出persons文档中5~10条的数据

   db.persons.find({},{_id:0,name:1}).limit(5).skip(5)

3.Sort返回按照年龄排序的数据[1,-1]

    db.persons.find({},{_id:0,name:1,age:1}).sort({age:1})

    注意:mongodb的key可以存不同类型的数据排序就也有优先级

    最小值    null   数字    字符串    对象/文档    数组    二进制    对象ID    布尔    日期

     时间戳 à 正则 à 最大值 

4.Limit和Skip完成分页

    4.1三条数据位一页进行分页

         第一页àdb.persons.find({},{_id:0,name:1}).limit(3).skip(0)

         第二页àdb.persons.find({},{_id:0,name:1}).limit(3).skip(3)

    4.2skip有性能问题,没有特殊情况下我们也可以换个思路

         对文档进行重新解构设计

每次查询操作的时候前后台传值全要把上次的最后一个文档的日期保存下来

db.persons.find({date:{$gt:日期数值}}).limit(3)

个人建议à应该把软件的中点放到便捷和精确查询上而不是分页的性能上因为用户最多不会翻查过2页的

1.游标

    利用游标遍历查询数据

   var  persons = db.persons.find();

   while(persons.hasNext()){

             obj = persons.next();

         print(obj.name)

    }

2.游标几个销毁条件

   1.客户端发来信息叫他销毁

   2.游标迭代完毕

   3.默认游标超过10分钟没用也会别清除

3.查询快照

    快照后就会针对不变的集合进行游标运动了,看看使用方法.

   db.persons.find({$query:{name:”Jim”},$snapshot:true})

    高级查询选项

    $query

    $orderby

    $maxsan:integer 最多扫描的文档数

    $min:doc  查询开始

    $max:doc  查询结束

    $hint:doc  使用哪个索引

    $explain:boolean 统计

    $snapshot:boolean 一致快照

1.创建简单索引

    for(vari = 0 ; i<200000 ;i++){

         db.books.insert({number:i,name:i+"book"})}

       1.先检验一下查询性能

           var start = new Date()

           db.books.find({number:65871})

           var end = new Date()

           end - start

        2.为number 创建索引

           db.books.ensureIndex({number:1})

        3.再执行第一部的代码可以看出有数量级的性能提升

2.索引使用需要注意的地方

        1.创建索引的时候注意1是正序创建索引-1是倒序创建索引

        2.索引的创建在提高查询性能的同事会影响插入的性能对于经常查询少插入的文档可以考虑用索引

        3.符合索引要注意索引的先后顺序

        4.每个键全建立索引不一定就能提高性能呢索引不是万能的

        5.在做排序工作的时候如果是超大数据量也可以考虑加上索引用来提高排序的性能

3.索引的名称

    3.1用VUE查看索引名称

   3.2创建索引同时指定索引的名字

         db.books.ensureIndex({name:-1},{name:”bookname”})

4.唯一索引

     4.1如何解决文档books不能插入重复的数值

          建立唯一索引

          db.books.ensureIndex({name:-1},{unique:true})

          试验

          db.books .insert({name:”1book”})

5.踢出重复值

     5.1如果建议唯一索引之前已经有重复数值如何处理

          db.books.ensureIndex({name:-1},{unique:true,dropDups:true})

6.Hint

     6.1如何强制查询使用指定的索引呢?

           db.books.find({name:"1book",number:1}).hint({name:-1})

           指定索引必须是已经创建了的索引

7.Expain

       7.1如何详细查看本次查询使用那个索引和查询数据的状态信息

              db.books.find({name:"1book"}).explain()

              “cursor” : “BtreeCursor name_-1“ 使用索引

             “nscanned” : 1 查到几个文档

              “millis” : 0 查询时间0是很不错的性能

1.system.indexes

       1.1在shell查看数据库已经建立的索引

              db.system.indexes.find()

              db.system.namespaces.find()

2.后台执行

       2.1执行创建索引的过程会暂时锁表问题如何解决?

              为了不影响查询我们可以叫索引的创建过程在后台

             db.books.ensureIndex({name:-1},{background:true})

3.删除索引

       3.1批量和精确删除索引

              db.runCommand({dropIndexes :”books” , index:”name_-1”})

              db.runCommand({dropIndexes :”books” , index:”*”})

1.Count

    请查询persons中美国学生的人数.

    db.persons.find({country:"USA"}).count()

2.Distinct

     请查询出persons中一共有多少个国家分别是什么.

     db.runCommand({distinct:"persons“ ,key:"country"}).values

3.Group

     语法:

     db.runCommand({group:{

                    ns:集合名字,

Key:分组的键对象,

Initial:初始化累加器,

$reduce:组分解器,

Condition:条件,

Finalize:组完成器

     }})

     分组首先会按照key进行分组,每组的每一个文档全要执行$reduce的方法,

     他接收2个参数一个是组内本条记录,一个是累加器数据.

3.1请查出persons中每个国家学生数学成绩最好的学生信息(必须在90以上)

db.runCommand({group:{

ns:"persons",

key:{"country":true},

initial:{m:0},

$reduce:function(doc,prev){

if(doc.m > prev.m){

prev.m = doc.m;

prev.name = doc.name;

prev.country = doc.country;

}

},

condition:{m:{$gt:90}}

}}) 

db.runCommand({group:{

         ns:"persons",

         key:{"country":true},

         initial:{m:0},

         $reduce:function(doc,prev){

                   if(doc.m> prev.m){

                            prev.m= doc.m;

                            prev.name= doc.name;

                            prev.country= doc.country;

                   }

         },

         finalize:function(prev){

                   prev.m= prev.name+" Math scores "+prev.m

         },

         condition:{m:{$gt:90}}

}})

 

db.persons.insert({

         name:"USPCAT",

         age:27,

         email:"2145567457@qq.com",

         c:89,m:100,e:67,

         counTry:"China",

         books:["JS","JAVA","EXTJS","MONGODB"]

})

 

db.runCommand({group:{

         ns:"persons",

         $keyf:function(doc){

                   if(doc.counTry){

                            return{country:doc.counTry}

                   }else{

                            return{country:doc.country}

                   }

         },

         initial:{m:0},

         $reduce:function(doc,prev){

                   if(doc.m> prev.m){

                            prev.m= doc.m;

                            prev.name= doc.name;

                            if(doc.country){

                                     prev.country= doc.country;

                            }else{

                                     prev.country= doc.counTry;

                            }

                   }

         },

         finalize:function(prev){

                   prev.m= prev.name+" Math scores "+prev.m

         },

         condition:{m:{$gt:90}}

}})

3.2在3.1要求基础之上吧没个人的信息链接起来写一个描述赋值到m上

finalize:function(prev){

 prev.m = prev.name+" Math scores"+prev.m

}

4.用函数格式化分组的键

       4.1如果集合中出现键Counrty和counTry同时存在那分组有点麻烦这要如何解决呢?

       $keyf:function(doc){

                return {country:doc.counTry}

       },…..

1.命令执行器runCommand

        1.1用命令执行完成一次删除表的操作

db.runCommand({drop:"map"})

{

       "nIndexesWas" : 2,

       "msg" : "indexes dropped for collection",

       "ns" : "foobar.map",

       "ok" : 1

}

2.如何查询mongoDB为我们提供的命令 

        1.在shell中执行db.listCommands()

        2.访问网址http://localhost:28017/_commands

3.常用命令举例

        3.1查询服务器版本号和主机操作系统

        db.runCommand({buildInfo:1})   

        3.2查询执行集合的详细信息,大小,空间,索引等……

        db.runCommand({collStats:"persons"})

        3.3查看操作本集合最后一次错误信息

        db.runCommand({getLastError:"persons"})

2.固定集合特性

       2.1固定集合默认是没有索引的就算是_id也是没有索引的

       2.2由于不需分配新的空间他的插入速度是非常快的

       2.3固定集合的顺是确定的导致查询速度是非常快的

       2.4最适合的是应用就是日志管理

3.创建固定集合

       3.1创建一个新的固定集合要求大小是100个字节,可以存储文档10个

            db.createCollection("mycoll",{size:100,capped:true,max:10})

       3.2把一个普通集合转换成固定集合

            db.runCommand({convertToCapped:”persons”,size:100000})

4.反向排序,默认是插入顺序排序.

       4.1查询固定集合mycoll并且反响排序

            db.mycoll.find().sort({$natural:-1})

5.尾部游标,可惜shell不支持java和php等驱动是支持的

       5.1尾部游标概念

            这是个特殊的只能用到固定级和身上的游标,他在没有结果的时候

            也不回自动销毁他是一直等待结果的到来

1.启动项 mongod --help

--dbpath

指定数据库的目录,默认在window下是c:\data\db\

--port

指定服务器监听的端口号码,默认是27017

--fork

用守护进程的方式启动mongoDB

--logpath

指定日志的输出路径,默认是控制台

--config

指定启动项用文件的路径

--auth

用安全认证方式启动数据库

1.1利用config配置文件来启动数据库改变端口为8888

      mongodb.conf文件

      dbpath = D:\sortware\mongod\db

      port = 8888

      启动文件

      cd C:\Users\thinkpad\Desktop\MONGODB\mongodb-win32-x86_64-2.0.6

      bin\mongod.exe --config ../mongodb.conf

      shell文件

      mongo 127.0.0.1:8888

2.停止mongoDB服务

   1.1ctrl+c 组合键可以关闭数据库

    1.2admin数据库命令关闭数据

1.导出数据(中断其他操作)

       打开CMD

       利用mongoexport

                    -d 指明使用的库

-c 指明要导出的表

-o 指明要导出的文件名

-csv 制定导出的csv格式

-q 过滤导出

--type <json|csv|tsv>

            1.1把数据好foobar中的persons导出

            mongoexport -d foobar -c persons -oD:/persons.json

        1.2导出其他主机数据库的文档

        mongoexport --host 192.168.0.16 --port 37017

2.导入数据(中断其他操作)

       API

       http://cn.docs.mongodb.org/manual/reference/mongoimport/

       2.1到入persons文件

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

1.运行时备份mongodump

       API

      http://cn.docs.mongodb.org/manual/reference/mongodump/

         1.1导出127.0.0.1服务下的27017下的foobar数据库

      mongodump --host 127.0.0.1:27017 -d foobar -o d:/foobar

2.运行时恢复mongorestore

      API

      http://cn.docs.mongodb.org/manual/reference/mongorestore/

      2.1删除原本的数据库用刚才导出的数据库恢复

      db.dropDatabase()

      mongorestore --host 127.0.0.1:27017 -d foobar -directoryperdbd:/foobar/foobar

3.懒人备份

      mongoDB是文件数据库这其实就可以用拷贝文件的方式进行备份

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值