java mongodb 删除字段类型_Mongodb基本数据类型、常用命令之增加、更新、删除
1.null---表示空值或者該字段不存在,如{"name":null}
2.布爾 --- 和java中的布爾一樣,有兩種:true,false,如{"sex":true}
3.浮點數(shù)---shell中所有的數(shù)字都是浮點數(shù),如{"age":12},{"money":2333.65}。
4.字符串---和java中的差不多,在mongodb都是utf-8字符集的,如{"username":"zangsan"}
5.對象id---對象id是文檔的12字節(jié)的唯一ID,如{"numId":ObjectId()} ,注:ObjectI是一長串字 ? ? ? ? ? ?符串,可以認為是主鍵。
6.日期---存的是從標準記元開始的毫秒數(shù),沒有存儲時區(qū)。如{"regTime":new Date()}
7.正則---文檔中可以包括正則表達示,采用js的正則表達示語法,如{"xx":/footbar/i}
8.代碼---文檔中還在可以包含js代碼,如{"x":function(){alert("1")}}
9.未定義---和js中差不多,也就是說文檔中也可以使用未定義類型(null和未定義是兩種不同的類 ? ? ? ? ? ?型),如{"x":undefined}
10.數(shù)組---值的集合或者列表可以表示成數(shù)組,如{"classes":["java","php","c#"]}
11.內(nèi)嵌文檔---文檔中可以包含其他的文檔,也可以作為值嵌入父文檔中,如{"student": ? ? ? ? ? ? ? ?{"name":"zangsan"}}
二、先講一些基本的操作東西,取自網(wǎng)絡:
成功啟動MongoDB后,再打開一個命令行窗口輸入mongo,就可以進行數(shù)據(jù)庫的一些操作。
輸入help可以看到基本操作命令:
show dbs:顯示數(shù)據(jù)庫列表show collections:顯示當前數(shù)據(jù)庫中的集合(類似關系數(shù)據(jù)庫中的表)show users:顯示用戶
use :切換當前數(shù)據(jù)庫,這和MS-SQL里面的意思一樣db.help():顯示數(shù)據(jù)庫操作命令,里面有很多的命令db.foo.help():顯示集合操作命令,同樣有很多的命令,foo指的是當前數(shù)據(jù)庫下,一個叫foo的集合,并非真正意義上的命令db.foo.find():對于當前數(shù)據(jù)庫中的foo集合進行數(shù)據(jù)查找(由于沒有條件,會列出所有數(shù)據(jù))db.foo.find( { a : 1 } ):對于當前數(shù)據(jù)庫中的foo集合進行查找,條件是數(shù)據(jù)中有一個屬性叫a,且a的值為1
MongoDB沒有創(chuàng)建數(shù)據(jù)庫的命令,但有類似的命令。
如:如果你想創(chuàng)建一個“myTest”的數(shù)據(jù)庫,先運行use myTest命令,之后就做一些操作(如:db.createCollection('user')),這樣就可以創(chuàng)建一個名叫“myTest”的數(shù)據(jù)庫。
數(shù)據(jù)庫常用命令
1、Help查看命令提示
help
db.help();
db.yourColl.help();
db.youColl.find().help();
rs.help();
2、切換/創(chuàng)建數(shù)據(jù)庫
use yourDB; ?當創(chuàng)建一個集合(table)的時候會自動創(chuàng)建當前數(shù)據(jù)庫
3、查詢所有數(shù)據(jù)庫
show dbs;
4、刪除當前使用數(shù)據(jù)庫
db.dropDatabase();
5、從指定主機上克隆數(shù)據(jù)庫
db.cloneDatabase(“127.0.0.1”); 將指定機器上的數(shù)據(jù)庫的數(shù)據(jù)克隆到當前數(shù)據(jù)庫
6、從指定的機器上復制指定數(shù)據(jù)庫數(shù)據(jù)到某個數(shù)據(jù)庫
db.copyDatabase("mydb", "temp", "127.0.0.1");將本機的mydb的數(shù)據(jù)復制到temp數(shù)據(jù)庫中
7、修復當前數(shù)據(jù)庫
db.repairDatabase();
8、查看當前使用的數(shù)據(jù)庫
db.getName();
db; db和getName方法是一樣的效果,都可以查詢當前使用的數(shù)據(jù)庫
9、顯示當前db狀態(tài)
db.stats();
10、當前db版本
db.version();
11、查看當前db的鏈接機器地址
db.getMongo();
Collection聚集集合
1、創(chuàng)建一個聚集集合(table)
db.createCollection(“collName”, {size: 20, capped: 5, max: 100});
2、得到指定名稱的聚集集合(table)
db.getCollection("account");
3、得到當前db的所有聚集集合
db.getCollectionNames();
4、顯示當前db所有聚集索引的狀態(tài)
db.printCollectionStats();
用戶相關
1、添加一個用戶
db.addUser("name");
db.addUser("userName", "pwd123", true); 添加用戶、設置密碼、是否只讀
2、數(shù)據(jù)庫認證、安全模式
db.auth("userName", "123123");
3、顯示當前所有用戶
show users;
4、刪除用戶
db.removeUser("userName");
其他
1、查詢之前的錯誤信息
db.getPrevError();
2、清除錯誤記錄
db.resetError();
查看聚集集合基本信息
1、查看幫助 ?db.yourColl.help();
2、查詢當前集合的數(shù)據(jù)條數(shù) ?db.yourColl.count();
3、查看數(shù)據(jù)空間大小 db.userInfo.dataSize();
4、得到當前聚集集合所在的db db.userInfo.getDB();
5、得到當前聚集的狀態(tài) 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的文檔,現(xiàn)在你使用db.user.find()命令就可以查看到剛才寫入的數(shù)據(jù)。注:這個操作會給文檔增加一個"_id"鍵(如果原來沒有話)。
當然你也可以使用db.user.save({name:"zangsan"})來達到一樣的效果。
你還可以這樣循環(huán)插入:for(var i=0;i<100;i++){db.user.save(num:i)}來插入一百條數(shù)據(jù)。
此時你可能要問這兩者的區(qū)別了,其實他們的區(qū)別很小,如下:
insert:僅僅表示插入到集合中去,如果記錄不存在就插入,存在就忽略。
save:不存在時就插入,存在就更新。
四、刪除
假如我現(xiàn)在想刪除user集合中的所有數(shù)據(jù),我就可以使用
db.user.remove();
假如我想刪除user集合中名字為zangsan的人,就使用
db.user.remouve({name:"zangsan"})
如果你還想清除user集合包括其名稱什么的那就使用drop吧:
db.user.drop(); 這條命令會返回你一個true和false,如果為ture就表示刪除掉了。
remove和drop的區(qū)別:這就好比mysql中的delete和drop,delete只會刪除數(shù)據(jù),不會對表結構什么的造成影響,用drop就會將整個表刪除包括表結構,同樣,在mongodb里,remove只會刪除數(shù)據(jù),而不會影響到集合的結構,比如索引,而drop就會刪除整個集合信息。你可以在剛才的drop之后再用db.user.find()看下。而且drop的刪除效果很快,快remove很多。
五、更新
更新就是update命令,該命令有四個參數(shù):
db.xx.update({},{},{},{})
第一個參數(shù)是查詢條件,就是將查詢出來的條件進行更新。如{name:"zangsan"}
第二個參數(shù)是你要修改的內(nèi)容{$set:{age:20}}
第三個參數(shù)是upsert:true,表示如果沒有匹配到文檔,則會插入一個新的文檔,存在時則進行更新,默認是false,但是他一次只會插入或者更新一條數(shù)據(jù)。
第四個參數(shù)為true,就是將查詢出來的數(shù)據(jù)都更新,默認是false,也就只更新第一條數(shù)據(jù)。
下面依次來將這四個參數(shù)的作用來實戰(zhàn):
初始數(shù)據(jù):
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:--驗證第一個參數(shù),第二個參數(shù)
db.user.update({name:"wangwu"},{$set:{age:19}});
將名為zangsan的age全部更改為20:----驗證第四個參數(shù)
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的數(shù)據(jù)啊,upsert表現(xiàn)的機會來了) --驗證第三個參數(shù)
db.user.update({name:"lidao"},{$set:{age:20}},true);你現(xiàn)在試下用db.user.find({name:"lidao"})
$set修改器:前面我們更新操作已經(jīng)用過了,現(xiàn)在我們詳細講解他的用法。
$set是用來指定一個鍵的值,如果這個鍵不存在,那么就創(chuàng)建他,存在就更新他。
a.我們將name為wangwu的age更改為22,那么就是
db.user.update({name:"wangwu"},{$set:{age:22}}); ?這就是執(zhí)行更新操作。
b.我們將name為wangwu的文檔,新增一個sex為man的值:
db.user.update({name:"wangwu"},{$set:{sex:"man"}});這就是執(zhí)行的增加鍵的操 ? ? ? ? ? 作。
c.我們將name為wangwu的文檔,將他的性別改變成又是man又是women:
db.user.update({name:"wangwu"},{$set:{sex:["man","women"]}});這就是執(zhí)行的更改數(shù)據(jù)類型的操作,也是更新操作。
d.$set還可以更改內(nèi)嵌文檔:
我們新增一條數(shù)據(jù): ? ? ?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有值,那么這個刪除就會執(zhí)行,age:0也會執(zhí)行刪除操作。
$inc:$inc操作會遞增或遞減數(shù)值,也就是說他是專門針對數(shù)字的增加或者減少用的。
如將 db.user.save({name:"wangwu",age:16})的age增加2,你就可以使用
db.user.update({name:"wangwu"},{$inc:{age:2}}),現(xiàn)在wangwu的age就變成24了。
注:$inc的效率很高,因為他很少會改變文檔的大小,而且$inc還能用于upsert中。
$rename:修改鍵名或都重命名子文檔。
如:將name為lisi的文檔中的age鍵更名為num,那么就這樣操作db.user.update({name:"lisi"},{$rename:{"age":"num"}})
數(shù)組的一些修改器:
特別說明:在對數(shù)組上使用$unset你會有意想不到的結果。假如你現(xiàn)在有一條這樣的數(shù)據(jù): db.user.save({name:"wangwu",age:16,classes:["java","c#","c"]}),現(xiàn)在我們將$unset應用于其上面,你會發(fā)現(xiàn),classes鍵并沒有刪除,而是classes對應的值全是設置成了null。
所以,$unset應用于數(shù)組上時,是將該鍵所對應的值全部設置為null,如果你想切底刪除某個數(shù)組,可以使用$pull和$pop操作,下面我們將詳細講解這兩個操作。
初始數(shù)據(jù):db.user.save({name:"lisi",class:["java","c"]})
$addToSet: 為數(shù)組里追加一些值(而不是將其原來的覆蓋掉),也就是增加一些不重復的東西。
向lisi這名學生的班加上c#課程:db.user.update({name:"lisi"},{$addToSet: ?{class:"c#"}}),再find方法看看是不是已經(jīng)有新增了c#課程了呢。
注:如果新增的值不存在就執(zhí)行增加操作,存在就忽略,不會更新修改文檔,也就是只能添加數(shù)組里不存在的東西。
$each:配合$addToSet使用,而且能達到很強的效果。如果想在一個操作里面數(shù)組添加多個唯一的值,必須結合$each方法來使用$addToSet(因為addToSet一次只能添加一個),如下例子:
先執(zhí)行db.user.update({name:"lisi"},{$addToSet:{$class:{$each:["java","c#","php"]}}})
使用db.user.find({name:"lisi"})查看結果。是不是發(fā)現(xiàn)java和c#并沒有重復添加過去,只是新增了一個php課程呢.這是因為僅當$each中的值不在class數(shù)組中才會添加,很簡單實用吧?嘿嘿
$push和$pushAll: 和java中的棧的push這也是一個對數(shù)組增加值的操作,加在最后。先看下$push操作,和$addToSet方法使用一樣: ,如給lisi增加一門為c++的課程: ?db.user.update({name:"lisi"},{$push: ?{class:"c++"}})。$pushAll從字面意思就能理解到,他就是添加多個值,他后面跟的是一個數(shù)組: db.user.update({name:"lisi"},{$pushAll: ?{class:["js","mongodb"]}})
注:$push和$addToSet不同的點:$addToSet添加新的東西必須是數(shù)組中不存在的值(如class有一個java,那加就加不進去的,只會存一個java),而$push不管存在與否,都可以加進去(如class有一個java,那么再加一個java進去,class里就有兩個數(shù)組了)。
$pop: 增加都講了,肯定是到了刪除操作了啥。要從數(shù)組刪除元素,最簡單的方法就是$pop操作。$pop會刪除是從數(shù)組中最后一個元素開始刪除的,且沒有$popAll與之對應刪除而是$pullAll。
如:db.user.update({name:"lisi"},{$pop:{class:1}}),他就會將lisi的最新增加了mongdob課程刪除掉。
$pull:比pop更高級一點但很類似,因為pull可以明確用值來指定下要刪除哪個數(shù)組的元素而不是位置。如我們要刪除lisi的java這門課:db.user.update({name:"lisi"},{$pull:{class:"java"}})
$pullAll:而$pullAll也是跟的一個數(shù)組,他是將pullAll數(shù)組的中值都從所要操作的數(shù)組中刪除掉。如,我們要將lisi的課程表中將c,c#這兩門課刪除:db.user.update({name:"lisi"},{$pullAll:{class:["c","c#"]}})
此外,mongodb還可以支持數(shù)組的位置更新,如現(xiàn)在的數(shù)據(jù)是: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呢?因為他基于原子性更新,并在同一次調(diào)用中返回,比如在訂單遷移很有用。
例如我們有一條db.user.save({name:"wangwu",age:16,classes:["java","c#","c"]})數(shù)據(jù),我們要將wangwu的age改為18并且返回更新后的文檔:
db.user.findAndModity({
query:{name:"wangwu"},
update:{$set:{age:18}},
new:true
})這一個操作就是基于原子性的。
現(xiàn)在就列出findAndModity的選項:
query,文檔查詢選擇器,默認為{}。
update,描述更新的文檔,默認為{}。
remove,布爾值,為true時刪除對象并返回,默認為false.
new,布爾值,為true返回修改后的文檔,默認為false.
sort,指定排序的方向,因為findAndModity一次只能修改一個文檔,就可以借助sort來升、降序排列。
fields,如果只須要返回字段的子集,可以通過該項選定。
upsert,布爾值為true時將findANdModity當做upsert對待。如果不存在就創(chuàng)建,但是要注意的是,如果希望返回新創(chuàng)建的文檔,還必須指定{new:true},不然是返回的是更新之前的文檔。
總結
以上是生活随笔為你收集整理的java mongodb 删除字段类型_Mongodb基本数据类型、常用命令之增加、更新、删除的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 集度汽车机器人部分内饰曝光:方向盘前所未
- 下一篇: oracle自动撤销管理,Oracle