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