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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM