你的位置:首页 > 数据库

[数据库]Mongodb基本数据类型、常用命令之增加、更新、删除


 1.null---表示空值或者该字段不存在,如{"name":null}

   2.布尔 --- 和java中的布尔一样,有两种:true,false,如{"sex":true}

   3.浮点数---shell中所有的数字都是浮点数,如{"age":12},{"money":2333.65}。

   4.字符串---和java中的差不多,在mongodb都是utf-8字符集的,如{"username":"zangsan"}

   5.对象id---对象id是文档的12字节的唯一ID,如{"numId":ObjectId()} ,注:ObjectI是一长串字            符串,可以认为是主键。

   6.日期---存的是从标准记元开始的毫秒数,没有存储时区。如{"regTime":new Date()}

   7.正则---文档中可以包括正则表达示,采用js的正则表达示语法,如{"xx":/footbar/i}

   8.代码---文档中还在可以包含js代码,如{"x":function(){alert("1")}}

   9.未定义---和js中差不多,也就是说文档中也可以使用未定义类型(null和未定义是两种不同的类            型),如{"x":undefined}

   10.数组---值的集合或者列表可以表示成数组,如{"classes":["java","php","c#"]}

   11.内嵌文档---文档中可以包含其他的文档,也可以作为值嵌入父文档中,如{"student":                {"name":"zangsan"}}

  原文地址: http://1145004.blog.51cto.com/1135004/1261829

 

二、先讲一些基本的操作东西,取自网络:

 

成功启动MongoDB后,再打开一个命令行窗口输入mongo,就可以进行数据库的一些操作。

输入help可以看到基本操作命令:

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

MongoDB没有创建数据库的命令,但有类似的命令。

如:如果你想创建一个“myTest”的数据库,先运行use myTest命令,之后就做一些操作(如:db.createCollection('user')),这样就可以创建一个名叫“myTest”的数据库。

数据库常用命令

1、Help查看命令提示

help

 db.help();

 db.yourColl.help();

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

 rs.help();

2、切换/创建数据库

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

3、查询所有数据库

show dbs;

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

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.getPrevError();
2、清除错误记录
db.resetError();
 
查看聚集集合基本信息
1、查看帮助  db.yourColl.help();
2、查询当前集合的数据条数  db.yourColl.count();
3、查看数据空间大小 db.userInfo.dataSize();
4、得到当前聚集集合所在的db db.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();

三、插入

   插入很简单,如下

   db.user.insert({name:"zangsan"})  --->表示向user集合插入一个name为zangsan的文档,现在你使用db.user.find()命令就可以查看到刚才写入的数据。注:这个操作会给文档增加一个"_id"键(如果原来没有话)。

   当然你也可以使用db.user.save({name:"zangsan"})来达到一样的效果。

   你还可以这样循环插入:for(var i=0;i<100;i++){db.user.save(num:i)}来插入一百条数据。

   此时你可能要问这两者的区别了,其实他们的区别很小,如下:

insert:仅仅表示插入到集合中去,如果记录不存在就插入,存在就忽略。

   save:不存在时就插入,存在就更新。

 

四、删除

   假如我现在想删除user集合中的所有数据,我就可以使用

   db.user.remove();

   假如我想删除user集合中名字为zangsan的人,就使用

   db.user.remouve({name:"zangsan"})

   如果你还想清除user集合包括其名称什么的那就使用drop吧:

   db.user.drop(); 这条命令会返回你一个true和false,如果为ture就表示删除掉了。

 remove和drop的区别:这就好比mysql中的delete和drop,delete只会删除数据,不会对表结构什么的造成影响,用drop就会将整个表删除包括表结构,同样,在mongodb里,remove只会删除数据,而不会影响到集合的结构,比如索引,而drop就会删除整个集合信息。你可以在刚才的drop之后再用db.user.find()看下。而且drop的删除效果很快,快remove很多。

 

五、更新

       更新就是update命令,该命令有四个参数:

       db.xx.update({},{},{},{})

         第一个参数是查询条件,就是将查询出来的条件进行更新。如{name:"zangsan"}

         第二个参数是你要修改的内容{$set:{age:20}}

         第三个参数是upsert:true,表示如果没有匹配到文档,则会插入一个新的文档,存在时则进行更新,默认是false,但是他一次只会插入或者更新一条数据。

         第四个参数为true,就是将查询出来的数据都更新,默认是false,也就只更新第一条数据。

   下面依次来将这四个参数的作用来实战:

   初始数据:

   db.user.save({name:"zangsan",age:11}),

   db.user.save({name:"zangsan",age:15}),

   db.user.save({name:"wangwu",age:16}),

db.user.save({name:"lisi",age:14,classes:["java","c#"]}),

   将名为wangwu的age更改19:--验证第一个参数,第二个参数

   db.user.update({name:"wangwu"},{$set:{age:19}});

   将名为zangsan的age全部更改为20:----验证第四个参数

    db.user.update({name:"zangsan"},{$set:{age:20}},false,true);

    使用db.user.update({name:"zangsan"},{$set:{age:20}});只会更新第一条(也就是name为zangsan,age为15),将其age更新为20,有空可以自己下来试下。

将名为lidao的age更新为34(你可能在想这里面没得名为lidao的数据啊,upsert表现的机会来了) --验证第三个参数

   db.user.update({name:"lidao"},{$set:{age:20}},true);你现在试下用db.user.find({name:"lidao"})

 

$set 修改器:前面我们更新操作已经用过了,现在我们详细讲解他的用法。

       $set是用来指定一个键的值,如果这个键不存在,那么就创建他,存在就更新他。

       a.我们将name为wangwu的age更改为22,那么就是

           db.user.update({name:"wangwu"},{$set:{age:22}});  这就是执行更新操作。

       b.我们将name为wangwu的文档,新增一个sex为man的值:

            db.user.update({name:"wangwu"},{$set:{sex:"man"}}); 这就是执行的增加键的操           作。

       c.我们将name为wangwu的文档,将他的性别改变成又是man又是women:

          db.user.update({name:"wangwu"},{$set:{sex:["man","women"]}});这就是执行的更改数据类型的操作,也是更新操作。

d.$set还可以更改内嵌文档:

         我们新增一条数据:      db.user.save({name:"chenlang",age:24,stu:{name:"chenbing",age:22}});

   我们将stu中的name为chenbing更改为chenhai:

   db.user.update({"stu.name":"chenbing"},{$set:{"stu.name":"chenhai"}})

 

$unset : 删除一个键,使用方法:如将name为lisi的文档中age键删除,

           db.user.update({name:"lisi"},{$unset:{age:1}}) 

           注:只要unset有值,那么这个删除就会执行,age:0也会执行删除操作。

 

$inc: $inc操作会递增或递减数值,也就是说他是专门针对数字的增加或者减少用的。

        如将 db.user.save({name:"wangwu",age:16})的age增加2,你就可以使用

           db.user.update({name:"wangwu"},{$inc:{age:2}}),现在wangwu的age就变成24了。

注:$inc的效率很高,因为他很少会改变文档的大小,而且$inc还能用于upsert中。

 

$rename: 修改键名或都重命名子文档。

       如:将name为lisi的文档中的age键更名为num,那么就这样操作db.user.update({name:"lisi"},{$rename:{"age":"num"}})

 

数组的一些修改器:

特别说明:在对数组上使用$unset你会有意想不到的结果。假如你现在有一条这样的数据: db.user.save({name:"wangwu",age:16,classes:["java","c#","c"]}),现在我们将$unset应用于其上面,你会发现,classes键并没有删除,而是classes对应的值全是设置成了null。

   所以,$unset应用于数组上时,是将该键所对应的值全部设置为null,如果你想切底删除某个数组,可以使用$pull和$pop操作,下面我们将详细讲解这两个操作。

   初始数据:db.user.save({name:"lisi",class:["java","c"]})

$addToSet : 为数组里追加一些值(而不是将其原来的覆盖掉),也就是增加一些不重复的东西。

       向lisi这名学生的班加上c#课程:db.user.update({name:"lisi"},{$addToSet:  {class:"c#"}}),再find方法看看是不是已经有新增了c#课程了呢。

注:如果新增的值不存在就执行增加操作,存在就忽略,不会更新修改文档,也就是只能添加数组里不存在的东西。

 

$each: 配合 $addToSet使用,而且能达到很强的效果如果想在一个操作里面数组添加多个唯一的值,必须结合$each方法来使用$addToSet(因为addToSet一次只能添加一个),如下例子:

   先执行db.user.update({name:"lisi"},{$addToSet:{$class:{$each:["java","c#","php"]}}})

   使用db.user.find({name:"lisi"})查看结果。是不是发现java和c#并没有重复添加过去,只是新增了一个php课程呢.这是因为仅当$each中的值不在class数组中才会添加,很简单实用吧?嘿嘿

 

$push和$pushAll: 和java中的栈的push 这也是一个对数组增加值的操作,加在最后。先看下$push操作,和$addToSet方法使用一样: ,如给lisi增加一门为c++的课程:  db.user.update({name:"lisi"},{$push:  {class:"c++"}})。$pushAll从字面意思就能理解到,他就是添加多个值,他后面跟的是一个数组: db.user.update({name:"lisi"},{$pushAll:  {class:["js","mongodb"]}})

   注:$push和$addToSet不同的点:$addToSet添加新的东西必须是数组中不存在的值(如class有一个java,那加就加不进去的,只会存一个java),而$push不管存在与否,都可以加进去(如class有一个java,那么再加一个java进去,class里就有两个数组了)。

 

$pop : 增加都讲了,肯定是到了删除操作了啥。要从数组删除元素,最简单的方法就是$pop操作。 $pop会删除是从数组中最后一个元素开始删除的,且没有$popAll与之对应删除而是$pullAll。

   如:db.user.update({name:"lisi"},{$pop:{class:1}}),他就会将lisi的最新增加了mongdob课程删除掉。

 

   $pull: 比pop更高级一点但很类似,因为pull可以明确用值来指定下要删除哪个数组的元素而不是位置。如我们要删除lisi的java这门课:db.user.update({name:"lisi"},{$pull:{class:"java"}})

 

$pullAll: 而$pullAll也是跟的一个数组,他是将pullAll数组的中值都从所要操作的数组中删除掉。如,我们要将lisi的课程表中将c,c#这两门课删除:db.user.update({name:"lisi"},{$pullAll:{class:["c","c#"]}})

 

   此外,mongodb还可以支持数组的位置更新,如现在的数据是:db.user.save({name:"wangwu",age:16,classes:["java","c#","c"]})

   我们要将wangwu的课程的第一个位置java变成mysql:db.user.update({name:"wangwu",{$set:{"classes.0":"mysql"}}})

 

最后:不得不说的findAndModity命令

为什么不得不说findAndModity呢?因为他基于原子性更新,并在同一次调用中返回,比如在订单迁移很有用。

   例如我们有一条db.user.save({name:"wangwu",age:16,classes:["java","c#","c"]})数据,我们要将wangwu的age改为18并且返回更新后的文档:

   db.user.findAndModity({

       query:{name:"wangwu"},

       update:{$set:{age:18}},

       new:true

   })这一个操作就是基于原子性的。

   现在就列出findAndModity的选项:

query,文档查询选择器,默认为{}。

      update,描述更新的文档,默认为{}。

      remove,布尔值,为true时删除对象并返回,默认为false.

      new,布尔值,为true返回修改后的文档,默认为false.

      sort,指定排序的方向,因为findAndModity一次只能修改一个文档,就可以借助sort来升、降序排列。

      fields,如果只须要返回字段的子集,可以通过该项选定。

       upsert,布尔值为true时将findANdModity当做upsert对待。如果不存在就创建,但是要注意的是,如果希望返回新创建的文档,还必须指定{new:true},不然是返回的是更新之前的文档。

   到此,Mongodb的基本增,删,改就完了。原文地址: http://1145004.blog.51cto.com/1135004/1261829