MongoDB初探

zuoluo2003發表於2015-03-26
與sql語句的簡單對比
在第一篇中分享了一些MongoDB的基本知識點,因為安裝執行其實都還是很輕巧的,所以對於大家上手來說應該問題不大,但是安裝完成,資料庫也可以連線了,但是MongoDB中是沒有辦法執行sql語句的。這個時候關係型資料庫中的一些思維直接移植過來就不適用了,但是大道至簡,其實道理還是相同的,對於的資料的操作可以透過api來完成,這個從某種程度上來說,是MongoDB的亮點也是另外一種優勢。
我簡單的總結了一下常用的sql語句的一些用法在MongoDB中改怎麼使用。
首先一個很大的不同是,在MongoDB中,沒有表的概念,都是以collection為基本的單位儲存的。可以透過show collections來檢視當前的資料庫中存在的collections
> show collections
startup_log
system.indexes
system.profile

我們來看看增刪改查的用法。
insert
原本sql語句中的類似下面的語句
insert into test values(100,'test1');
在MongoDB中可以使用如下的方式來實現,我們多插入一些資料。
db.test.insert({id:11,name:"test1"});
db.test.insert({id:12,name:"test2"});
db.test.insert({id:13,name:"test3"});
db.test.insert({id:14,name:"test4"});
db.test.insert({id:15,name:"test5"});
db.test.insert({id:16,name:"test6"});
檢視一下資料的情況。
> db.test.find();
{ "_id" : ObjectId("550edf9b14fce649885d6489"), "id" : 11, "name" : "test1" }
{ "_id" : ObjectId("550edf9b14fce649885d648a"), "id" : 12, "name" : "test2" }
{ "_id" : ObjectId("550edf9b14fce649885d648b"), "id" : 13, "name" : "test3" }
{ "_id" : ObjectId("550edf9b14fce649885d648c"), "id" : 14, "name" : "test4" }
{ "_id" : ObjectId("550edf9b14fce649885d648d"), "id" : 15, "name" : "test5" }
{ "_id" : ObjectId("550edf9b14fce649885d648e"), "id" : 16, "name" : "test6" }
這個時候檢視collections會發現,已經建立好了這個collection
> show collections
startup_log
system.indexes
system.profile
test
還有一種插入方式,如果注意到上面的資料話,會發現有一個隱含列_id,如果需要手動指定_id列的值,可以使用save方法。
> db.test.save({_id:100001,id:11,name:"test_new"})
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 100001 })
檢視新插入的資料,注意_id的值
> db.test.find();
{ "_id" : ObjectId("550edf9b14fce649885d6489"), "id" : 11, "name" : "test1" }
{ "_id" : ObjectId("550edf9b14fce649885d648a"), "id" : 12, "name" : "test2" }
{ "_id" : ObjectId("550edf9b14fce649885d648b"), "id" : 13, "name" : "test3" }
{ "_id" : ObjectId("550edf9b14fce649885d648c"), "id" : 14, "name" : "test4" }
{ "_id" : ObjectId("550edf9b14fce649885d648d"), "id" : 15, "name" : "test5" }
{ "_id" : ObjectId("550edf9b14fce649885d648e"), "id" : 16, "name" : "test6" }
{ "_id" : 100001, "id" : 11, "name" : "test_new" }

delete

如果需要刪除_id為100001的列的話,可以使用如下的方法
> db.test.remove({_id:100001})
WriteResult({ "nRemoved" : 1 })
> db.test.find();
{ "_id" : ObjectId("550edf9b14fce649885d6489"), "id" : 11, "name" : "test1" }
{ "_id" : ObjectId("550edf9b14fce649885d648a"), "id" : 12, "name" : "test2" }
{ "_id" : ObjectId("550edf9b14fce649885d648b"), "id" : 13, "name" : "test3" }
{ "_id" : ObjectId("550edf9b14fce649885d648c"), "id" : 14, "name" : "test4" }
{ "_id" : ObjectId("550edf9b14fce649885d648d"), "id" : 15, "name" : "test5" }
{ "_id" : ObjectId("550edf9b14fce649885d648e"), "id" : 16, "name" : "test6" }

update
我們嘗試修改name列為test3的資料,修改id為18
> db.test.update({name:"test3"},{$set:{id:18}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.test.find();
{ "_id" : ObjectId("550edf9b14fce649885d6489"), "id" : 11, "name" : "test1" }
{ "_id" : ObjectId("550edf9b14fce649885d648a"), "id" : 12, "name" : "test2" }
{ "_id" : ObjectId("550edf9b14fce649885d648b"), "id" : 18, "name" : "test3" }
{ "_id" : ObjectId("550edf9b14fce649885d648c"), "id" : 14, "name" : "test4" }
{ "_id" : ObjectId("550edf9b14fce649885d648d"), "id" : 15, "name" : "test5" }
{ "_id" : ObjectId("550edf9b14fce649885d648e"), "id" : 16, "name" : "test6" }

or的使用方法
在sql where字句中,經常會有or這樣的過濾條件
我們來簡單模擬一下 name為test或者name為test2的資料
> db.test.find({"$or":[{name:"test1"},{name:"test2"}]})  
{ "_id" : ObjectId("550edf9b14fce649885d6489"), "id" : 11, "name" : "test1" }
{ "_id" : ObjectId("550edf9b14fce649885d648a"), "id" : 12, "name" : "test2" }

and的使用方法
我們來模擬一下name為test1並且name為test2這樣的資料,這樣的資料應該不存在,以下是一個錯誤的例子。
> db.test.find({name:"test1"},{name:"test2"})
{ "_id" : ObjectId("550edf9b14fce649885d6489"), "name" : "test1" }
正確的用法應該這麼寫。
模擬name為test1並且id為11的資料
> db.test.find({"$and":[{name:"test1"},{id:11}]})
{ "_id" : ObjectId("550edf9b14fce649885d6489"), "id" : 11, "name" : "test1" }

rownum
>  db.test.find().limit(2);
{ "_id" : ObjectId("550edf9b14fce649885d6489"), "id" : 11, "name" : "test1" }
{ "_id" : ObjectId("550edf9b14fce649885d648a"), "id" : 12, "name" : "test2" }

count
> db.test.count();
6

order by 

注意排序的情況
>  db.test.find().sort({name:-1})                                            
{ "_id" : ObjectId("550edf9b14fce649885d648e"), "id" : 16, "name" : "test6" }
{ "_id" : ObjectId("550edf9b14fce649885d648d"), "id" : 15, "name" : "test5" }
{ "_id" : ObjectId("550edf9b14fce649885d648c"), "id" : 14, "name" : "test4" }
{ "_id" : ObjectId("550edf9b14fce649885d648b"), "id" : 18, "name" : "test3" }
{ "_id" : ObjectId("550edf9b14fce649885d648a"), "id" : 12, "name" : "test2" }
{ "_id" : ObjectId("550edf9b14fce649885d6489"), "id" : 11, "name" : "test1" }
> db.test.find().sort({name:1})  
{ "_id" : ObjectId("550edf9b14fce649885d6489"), "id" : 11, "name" : "test1" }
{ "_id" : ObjectId("550edf9b14fce649885d648a"), "id" : 12, "name" : "test2" }
{ "_id" : ObjectId("550edf9b14fce649885d648b"), "id" : 18, "name" : "test3" }
{ "_id" : ObjectId("550edf9b14fce649885d648c"), "id" : 14, "name" : "test4" }
{ "_id" : ObjectId("550edf9b14fce649885d648d"), "id" : 15, "name" : "test5" }
{ "_id" : ObjectId("550edf9b14fce649885d648e"), "id" : 16, "name" : "test6" }

in 的使用
得到name在test1,test2,test3的資料 
> db.test.find({'name' : {'$in' : ["test1", "test2", "test3"]}});
{ "_id" : ObjectId("550edf9b14fce649885d6489"), "id" : 11, "name" : "test1" }
{ "_id" : ObjectId("550edf9b14fce649885d648a"), "id" : 12, "name" : "test2" }
{ "_id" : ObjectId("550edf9b14fce649885d648b"), "id" : 18, "name" : "test3" }
>

not in的使用
> db.test.find({'name' : {'$nin' : ["test1", "test2", "test3"]}});
{ "_id" : ObjectId("550edf9b14fce649885d648c"), "id" : 14, "name" : "test4" }
{ "_id" : ObjectId("550edf9b14fce649885d648d"), "id" : 15, "name" : "test5" }
{ "_id" : ObjectId("550edf9b14fce649885d648e"), "id" : 16, "name" : "test6" }

大於等於。。的使用
id大於14的資料
> db.test.find({id: {$gte: 14}});
{ "_id" : ObjectId("550edf9b14fce649885d648b"), "id" : 18, "name" : "test3" }
{ "_id" : ObjectId("550edf9b14fce649885d648c"), "id" : 14, "name" : "test4" }
{ "_id" : ObjectId("550edf9b14fce649885d648d"), "id" : 15, "name" : "test5" }
{ "_id" : ObjectId("550edf9b14fce649885d648e"), "id" : 16, "name" : "test6" }

like的使用 
> db.test.find({name:/5/});
{ "_id" : ObjectId("550edf9b14fce649885d648d"), "id" : 15, "name" : "test5" }
 
distinct
distinct的使用,不過和sql中還是存在一定的差距,有點mapreduce的味道。
> db.test.distinct('name');
[ "test1", "test2", "test3", "test4", "test5", "test6" ]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/76103/viewspace-1473953/,如需轉載,請註明出處,否則將追究法律責任。