安裝html
huijundeMacBook-Pro:~ huijunzhang$ brew install mongodb ... ==> Downloading https://homebrew.bintray.com/bottles/mongodb-3.2.9.el_capitan.bottle.tar.gz ######################################################################## 100.0% ==> Pouring mongodb-3.2.9.el_capitan.bottle.tar.gz ==> Caveats To have launchd start mongodb now and restart at login: brew services start mongodb Or, if you don't want/need a background service you can just run: mongod --config /usr/local/etc/mongod.conf ==> Summary 🍺 /usr/local/Cellar/mongodb/3.2.9: 17 files, 241.2M
啓動MongoDB正則表達式
上面提示的直接啓動mongo的方法sql
mongod --config /usr/local/etc/mongod.conf
具體操做以下:mongodb
huijundeMacBook-Pro:~ huijunzhang$ mongod --config /usr/local/etc/mongod.conf & [1] 19869 huijundeMacBook-Pro:~ huijunzhang$ mongo MongoDB shell version: 3.2.9 connecting to: test Welcome to the MongoDB shell. For interactive help, type "help". For more comprehensive documentation, see http://docs.mongodb.org/ Questions? Try the support group http://groups.google.com/group/mongodb-user Server has startup warnings: 2016-08-31T09:30:34.820+0800 I CONTROL [initandlisten] 2016-08-31T09:30:34.820+0800 I CONTROL [initandlisten] ** WARNING: soft rlimits too low. Number of files is 256, should be at least 1000
到此,mongoDB在mac下的安裝就完成了shell
mongodb中的基本操做無非就是增刪改查,看下邊數據庫
> db.table_name.insert({"name":"zhj","age":20,"province":"henan"}) WriteResult({ "nInserted" : 1 }) > db.table_name.insert({"name":"zjf","age":18,"province":"beijing"}) WriteResult({ "nInserted" : 1 }) > db.table_name.insert({"name":"zg","age":22,"province":"beijing"}) WriteResult({ "nInserted" : 1 })
mongo不支持批量插入,若是須要批量插入,就使用for循環操做api
> db.table_name.find() { "_id" : ObjectId("57c6364278935e710c61131b"), "name" : "zhj", "age" : 20, "province" : "henan" } { "_id" : ObjectId("57c6365e78935e710c61131c"), "name" : "zjf", "age" : 18, "province" : "beijing" } { "_id" : ObjectId("57c6366e78935e710c61131d"), "name" : "zg", "age" : 22, "province" : "beijing" }
sql | mongo | 說明 | ---|---|---|數組
|$gt |大於 =|$gte|大於等於 < |$lt |小於 <=|$lte|小於等於 !=|$ne |不等於 ==| |等於函數
#select * from table_name where age == 20 db.table_name.find({"age":20}) #select * from table_name where age != 20 db.table_name.find({"age":{$ne:20}}) #select * from table_name where age > 20 db.table_name.find({"age":{$gt:20}}) #select * from table_name where age < 20 db.table_name.find({"age":{$lt:20}}) #select * from table_name where age >= 20 db.table_name.find({"age":{$gte:20}}) #select * from table_name where age <= 20 db.table_name.find({"age":{$lte:20}}) # 具體操做以下 > db.table_name.find({"age":20}) { "_id" : ObjectId("57c6364278935e710c61131b"), "name" : "zhj", "age" : 20, "province" : "henan" } > db.table_name.find({"age":{$ne:20}}) { "_id" : ObjectId("57c6365e78935e710c61131c"), "name" : "zjf", "age" : 18, "province" : "beijing" } { "_id" : ObjectId("57c6366e78935e710c61131d"), "name" : "zg", "age" : 22, "province" : "beijing" } > db.table_name.find({"age":{$gt:20}}) { "_id" : ObjectId("57c6366e78935e710c61131d"), "name" : "zg", "age" : 22, "province" : "beijing" } > db.table_name.find({"age":{$lt:20}}) { "_id" : ObjectId("57c6365e78935e710c61131c"), "name" : "zjf", "age" : 18, "province" : "beijing" } > db.table_name.find({"age":{$gte:20}}) { "_id" : ObjectId("57c6364278935e710c61131b"), "name" : "zhj", "age" : 20, "province" : "henan" } { "_id" : ObjectId("57c6366e78935e710c61131d"), "name" : "zg", "age" : 22, "province" : "beijing" } > db.table_name.find({"age":{$lte:20}}) { "_id" : ObjectId("57c6364278935e710c61131b"), "name" : "zhj", "age" : 20, "province" : "henan" } { "_id" : ObjectId("57c6365e78935e710c61131c"), "name" : "zjf", "age" : 18, "province" : "beijing" }
sql | mongo | 說明 |
---|---|---|
and | ||
or | $or | |
in | $in | |
not in | $nin |
db.table_name.find({"name":"zhj","province":"henan"}) db.table_name.find({$or:[{"province":"henan"},{"province":"beijing"}]}) db.table_name.find({"province":{$in:["henan","beijing"]}}) db.table_name.find({"province":{$nin:["henan","beijing"]}}) # 具體操做以下 > db.table_name.find({"name":"zhj","province":"henan"}) { "_id" : ObjectId("57c6364278935e710c61131b"), "name" : "zhj", "age" : 20, "province" : "henan" } > db.table_name.find({$or:[{"province":"henan"},{"province":"beijing"}]}) { "_id" : ObjectId("57c6364278935e710c61131b"), "name" : "zhj", "age" : 20, "province" : "henan" } { "_id" : ObjectId("57c6365e78935e710c61131c"), "name" : "zjf", "age" : 18, "province" : "beijing" } { "_id" : ObjectId("57c6366e78935e710c61131d"), "name" : "zg", "age" : 22, "province" : "beijing" } > db.table_name.find({"province":{$in:["henan","beijing"]}}) { "_id" : ObjectId("57c6364278935e710c61131b"), "name" : "zhj", "age" : 20, "province" : "henan" } { "_id" : ObjectId("57c6365e78935e710c61131c"), "name" : "zjf", "age" : 18, "province" : "beijing" } { "_id" : ObjectId("57c6366e78935e710c61131d"), "name" : "zg", "age" : 22, "province" : "beijing" } > db.table_name.find({"province":{$nin:["henan","beijing"]}}) >
正則表達式sqlserver
匹配以'j'開頭,'e'結尾的 db.table_name.find({"name":/^j/,"name":/e$/}) > db.table_name.find({"name":/^j/,"name":/g$/}) { "_id" : ObjectId("57c6366e78935e710c61131d"), "name" : "zg", "age" : 22, "province" : "beijing" }
$where
$where中的value就是咱們經常使用的js # find name='zhj' db.table_name.find({$where:function(){return this.name == 'zhj'}}) # 具體操做以下 > db.table_name.find({$where:function(){return this.name == 'zhj'}}) { "_id" : ObjectId("57c6364278935e710c61131b"), "name" : "zhj", "age" : 20, "province" : "henan" }
db.table_name.insert({"name":"zhj"},{"name":"zhj","age":18})
總體更新:
var model = db.table_name.findOne({"name":"zhj"}) model.age = 30 db.table_name.update({"name":"zhj"},model) # 具體操做以下 > var model = db.table_name.findOne({"name":"zhj"}) > model.age = 30 30 > db.table_name.update({"name":"zhj"},model) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.table_name.find() { "_id" : ObjectId("57c6364278935e710c61131b"), "name" : "zhj", "age" : 30, "province" : "henan" } { "_id" : ObjectId("57c6365e78935e710c61131c"), "name" : "zjf", "age" : 18, "province" : "beijing" } { "_id" : ObjectId("57c6366e78935e710c61131d"), "name" : "zg", "age" : 22, "province" : "beijing" }
局部更新:
① $inc修改器
$inc也就是increase的縮寫,學過sqlserver的同窗應該很熟悉,好比咱們作一個在線用戶狀態記錄,每次修改會在原有的基礎上自增$inc指定的值,若是「文檔」中沒有此key,則會建立key,下面的例子一看就懂。
# 原數據的age=20,執行完下面語句,age=50,在原來的基礎上加了30 db.table_name.update({"name":"zhj"},{$inc:{"age":30}}) # 具體操做以下 > db.table_name.find() { "_id" : ObjectId("57c6364278935e710c61131b"), "name" : "zhj", "age" : 30, "province" : "henan" } { "_id" : ObjectId("57c6365e78935e710c61131c"), "name" : "zjf", "age" : 18, "province" : "beijing" } { "_id" : ObjectId("57c6366e78935e710c61131d"), "name" : "zg", "age" : 22, "province" : "beijing" } > db.table_name.update({"name":"zhj"},{$inc:{"age":30}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.table_name.find() { "_id" : ObjectId("57c6364278935e710c61131b"), "name" : "zhj", "age" : 60, "province" : "henan" } { "_id" : ObjectId("57c6365e78935e710c61131c"), "name" : "zjf", "age" : 18, "province" : "beijing" } { "_id" : ObjectId("57c6366e78935e710c61131d"), "name" : "zg", "age" : 22, "province" : "beijing" }
② $set修改器
db.table_name.update({"name":"zhj"},{$set:{"age":30}}) # 具體操做以下 > db.table_name.update({"name":"zhj"},{$set:{"age":30}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.table_name.find() { "_id" : ObjectId("57c6364278935e710c61131b"), "name" : "zhj", "age" : 30, "province" : "henan" } { "_id" : ObjectId("57c6365e78935e710c61131c"), "name" : "zjf", "age" : 18, "province" : "beijing" } { "_id" : ObjectId("57c6366e78935e710c61131d"), "name" : "zg", "age" : 22, "province" : "beijing" }
這個但是mongodb創造出來的「詞」,你們還記得update方法的第一次參數是「查詢條件」嗎?,那麼這個upsert操做就是說:若是我沒有查到,我就在數據庫裏面新增一條,其實這樣也有好處,就是避免了我在數據庫裏面判斷是update仍是add操做,使用起來很簡單,將update的第三個參數設爲true便可。
db.table_name.update({"name":"zhanghj"},{$inc:{"age":30}},true) # 具體操做以下 > db.table_name.update({"name":"zhanghj"},{$inc:{"age":30}},true) WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : ObjectId("57c63ef3a34de94e98acbdd7") }) > db.table_name.find() { "_id" : ObjectId("57c6364278935e710c61131b"), "name" : "zhj", "age" : 30, "province" : "henan" } { "_id" : ObjectId("57c6365e78935e710c61131c"), "name" : "zjf", "age" : 18, "province" : "beijing" } { "_id" : ObjectId("57c6366e78935e710c61131d"), "name" : "zg", "age" : 22, "province" : "beijing" } { "_id" : ObjectId("57c63ef3a34de94e98acbdd7"), "name" : "zhanghj", "age" : 30 }
在mongodb中若是匹配多條,默認的狀況下只更新第一條,那麼若是咱們有需求必須批量更新,那麼在mongodb中實現也是很簡單的,在update的第四個參數中設爲true便可。例子就不舉了。
#有第四個參數的所有更新 > db.table_name.find() { "_id" : ObjectId("57c6364278935e710c61131b"), "name" : "zhj", "age" : 30, "province" : "henan" } { "_id" : ObjectId("57c6365e78935e710c61131c"), "name" : "zjf", "age" : 18, "province" : "beijing" } { "_id" : ObjectId("57c6366e78935e710c61131d"), "name" : "zg", "age" : 22, "province" : "beijing" } { "_id" : ObjectId("57c63ef3a34de94e98acbdd7"), "name" : "zhanghj", "age" : 30 } { "_id" : ObjectId("57c63fa978935e710c61131e"), "name" : "zhj", "age" : 10, "province" : "hubei" } { "_id" : ObjectId("57c63fb678935e710c61131f"), "name" : "zhj", "age" : 10, "province" : "hebei" } > db.table_name.update({"name":"zhj"},{$set:{"age":2}},false,true) WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 }) > db.table_name.find() { "_id" : ObjectId("57c6364278935e710c61131b"), "name" : "zhj", "age" : 2, "province" : "henan" } { "_id" : ObjectId("57c6365e78935e710c61131c"), "name" : "zjf", "age" : 18, "province" : "beijing" } { "_id" : ObjectId("57c6366e78935e710c61131d"), "name" : "zg", "age" : 22, "province" : "beijing" } { "_id" : ObjectId("57c63ef3a34de94e98acbdd7"), "name" : "zhanghj", "age" : 30 } { "_id" : ObjectId("57c63fa978935e710c61131e"), "name" : "zhj", "age" : 2, "province" : "hubei" } { "_id" : ObjectId("57c63fb678935e710c61131f"), "name" : "zhj", "age" : 2, "province" : "hebei" } #沒有第四個參數的只更新第一條 > db.table_name.find() { "_id" : ObjectId("57c6364278935e710c61131b"), "name" : "zhj", "age" : 2, "province" : "henan" } { "_id" : ObjectId("57c6365e78935e710c61131c"), "name" : "zjf", "age" : 18, "province" : "beijing" } { "_id" : ObjectId("57c6366e78935e710c61131d"), "name" : "zg", "age" : 22, "province" : "beijing" } { "_id" : ObjectId("57c63ef3a34de94e98acbdd7"), "name" : "zhanghj", "age" : 30 } { "_id" : ObjectId("57c63fa978935e710c61131e"), "name" : "zhj", "age" : 2, "province" : "hubei" } { "_id" : ObjectId("57c63fb678935e710c61131f"), "name" : "zhj", "age" : 2, "province" : "hebei" } > db.table_name.update({"name":"zhj"},{$set:{"age":20}},false) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.table_name.find() { "_id" : ObjectId("57c6364278935e710c61131b"), "name" : "zhj", "age" : 20, "province" : "henan" } { "_id" : ObjectId("57c6365e78935e710c61131c"), "name" : "zjf", "age" : 18, "province" : "beijing" } { "_id" : ObjectId("57c6366e78935e710c61131d"), "name" : "zg", "age" : 22, "province" : "beijing" } { "_id" : ObjectId("57c63ef3a34de94e98acbdd7"), "name" : "zhanghj", "age" : 30 } { "_id" : ObjectId("57c63fa978935e710c61131e"), "name" : "zhj", "age" : 2, "province" : "hubei" } { "_id" : ObjectId("57c63fb678935e710c61131f"), "name" : "zhj", "age" : 2, "province" : "hebei" } >
db.table_name.remove()
常見的聚合操做有:count、distinct、group、mapReduce
> db.table_name.find() { "_id" : ObjectId("57c6364278935e710c61131b"), "name" : "zhj", "age" : 20, "province" : "henan" } { "_id" : ObjectId("57c6365e78935e710c61131c"), "name" : "zjf", "age" : 18, "province" : "beijing" } { "_id" : ObjectId("57c6366e78935e710c61131d"), "name" : "zg", "age" : 22, "province" : "beijing" } { "_id" : ObjectId("57c63ef3a34de94e98acbdd7"), "name" : "zhanghj", "age" : 30 } { "_id" : ObjectId("57c63fa978935e710c61131e"), "name" : "zhj", "age" : 2, "province" : "hubei" } { "_id" : ObjectId("57c63fb678935e710c61131f"), "name" : "zhj", "age" : 2, "province" : "hebei" } > db.table_name.count() 6 > db.table_name.count({"age":2}) 2
> db.table_name.distinct("name") [ "zhj", "zjf", "zg", "zhanghj" ]
在mongodb裏面作group操做有點小複雜,不過你們對sql server 裏面的group比較熟悉的話仍是一眼能看的明白的,其實group操做本質上造成了一種「k-v」模型,就像C#中的Dictionary,好,有了這種思惟,咱們來看看如何使用group。
下面舉的例子就是按照age進行group操做,value爲對應age的姓名。下面對這些參數介紹一下:
$reduce: 這個函數的第一個參數是當前的文檔對象,第二個參數是上一次function操做的累計對象,第一次爲initial中的{」perosn「:[]}。有多少個文檔, $reduce就會調用多少次。
> db.table_name.find() { "_id" : ObjectId("57c6364278935e710c61131b"), "name" : "zhj", "age" : 20, "province" : "henan" } { "_id" : ObjectId("57c6365e78935e710c61131c"), "name" : "zjf", "age" : 18, "province" : "beijing" } { "_id" : ObjectId("57c6366e78935e710c61131d"), "name" : "zg", "age" : 22, "province" : "beijing" } { "_id" : ObjectId("57c63ef3a34de94e98acbdd7"), "name" : "zhanghj", "age" : 30 } { "_id" : ObjectId("57c63fa978935e710c61131e"), "name" : "zhj", "age" : 2, "province" : "hubei" } { "_id" : ObjectId("57c63fb678935e710c61131f"), "name" : "zhj", "age" : 2, "province" : "hebei" } > db.table_name.group({ ... "key":{"age":true}, ... "initial":{"table_name":[]}, ... "$reduce":function(cur,prev){ ... prev.table_name.push(cur.name); ... } ... }) [ { "age" : 20, "table_name" : [ "zhj" ] }, { "age" : 18, "table_name" : [ "zjf" ] }, { "age" : 22, "table_name" : [ "zg" ] }, { "age" : 30, "table_name" : [ "zhanghj" ] }, { "age" : 2, "table_name" : [ "zhj", "zhj" ] } ]
看到上面的結果,是否是有點感受,咱們經過age查看到了相應的name人員,不過有時咱們可能有以下的要求:
①:想過濾掉age>25一些人員。
②:有時person數組裏面的人員太多,我想加上一個count屬性標明一下。
針對上面的需求,在group裏面仍是很好辦到的,由於group有這麼兩個可選參數: condition 和 finalize。
finalize:這是個函數,每一組文檔執行完後,多會觸發此方法,那麼在每組集合裏面加上count也就是它的活了。
> db.table_name.group({ ... "key":{"age":true}, ... "initial":{"table_name":[]}, ... "$reduce":function(cur,prev){ ... prev.table_name.push(cur.name); ... }, ... "finalize":function(out){ ... out.count=out.table_name.length; ... }, ... "condition":{"age":{$gt:18}} ... }) [ { "age" : 20, "table_name" : [ "zhj" ], "count" : 1 }, { "age" : 22, "table_name" : [ "zg" ], "count" : 1 }, { "age" : 30, "table_name" : [ "zhanghj" ], "count" : 1 } ]
參見:http://www.cnblogs.com/huangxincheng/archive/2012/02/21/2361205.html
mongodb裏面的遊標有點相似咱們說的C#裏面延遲執行,好比:
var list=db.person.find();
針對這樣的操做,list其實並無獲取到person中的文檔,而是申明一個「查詢結構」,等咱們須要的時候經過for或者next()一次性加載過來,而後讓遊標逐行讀取,當咱們枚舉完了以後,遊標銷燬,以後咱們在經過list獲取時,
發現沒有數據返回了。
> var list = db.table_name.find() > list.forEach(function(x){print(x.name)}) zhj zjf zg zhanghj zhj zhj > list >
固然咱們的「查詢構造」還能夠搞的複雜點,好比分頁,排序均可以加進去。
var single=db.table_name.find().sort({"name":1}).skip(2).limit(2);
那麼這樣的「查詢構造」能夠在咱們須要執行的時候執行,大大提升了沒必要要的花銷。
sql:
db.car_db.count({ "date_create": { $gte: ISODate("2016-05-23T16:00:00.000+0000"), $lt: ISODate("2016-05-24T16:00:00.000+0000") }, 'site': 'che168' })
聚合:
db.maiche168_car_info.aggregate( [ { $group: { _id: "$shop_id", company_name:{ $first: "$company_name"}, company_address:{ $first: "$company_address"}, province_name:{ $first: "$province_name"}, city_name:{ $first: "$city_name"}, seller_phone:{ $first: "$seller_phone"}, tags:{ $first: "$tags"}, total:{ $sum: 1}, } } ] )
---