mongoDB與redis同爲noSql數據庫,可是redis爲kv數據庫(key/value),而mongoDB爲文檔型數據庫存儲的是文檔(Bson->json的二進制化).內部執行引擎爲JS解釋器, 把文檔存儲成bson結構,在查詢時,轉換爲JS對象,並能夠經過熟悉的js語法來操做mysql
在linux上直接下載解壓運行便可,自己是已編譯好的二進制可執行文件.
若是報錯-bash: /usr/local/mongodb/bin/mongod: cannot execute binary file
說明你的服務器和mongodb 的版本不對應, 若是服務器是64位,下載x86_64的mongodb ,若是服務器是32位的, 下載i686的mongodb/linux
bsondump 導出BSON結構 mongo 客戶端 mongod 服務端 mongodump 總體數據庫二進制導出 mongoexport 導出易識別的json文檔或csv文檔 mongorestore 數據庫總體導入 mongos 路由器(分片用) mongofiles GridFS工具,內建的分佈式文件系統 mongoimport 數據導入程序 mongotop 運維監控 mongooplog mongoperf mongostat
#啓動服務端 ./mongod --dbpath /usr/local/mongodb/data --logpath /usr/local/mongodb/logs/mongo.log --fork --port 27017 #啓動客戶端 ./mongo ./mongo --host xxx -u adminUserName -p userPassword --authenticationDatabase admin #可遠程登陸並指定登陸用戶以及數據庫目錄
注意:正則表達式
關於日誌文件和數據存儲路徑的指定必定要是正確的,不然就會報以下錯誤redis
ERROR: child process failed, exited with error number 1
mongodb很是的佔磁盤空間, 剛啓動後要佔3-4G左右,若是你用虛擬機練習,可能空間不夠,致使沒法啓動.能夠用 --smallfiles 選項來啓動, 將會佔用較小空間,大約400M左右.sql
32位的mongo客戶端貌似會出現段錯誤(segmentation fault)
mongodb
mongodb服務器啓動時, 默認不是須要認證的.
要讓用戶生效, 須要啓動服務器時,就指定--auth
選項.這樣, 操做時,就須要認證了(另外也能夠在其配置文件中指定)數據庫
參數解釋:json
--dbpath 數據存儲目錄 --logpath 日誌存儲目錄 --port 運行端口(默認27017) --fork 後臺進程運行
show dbs/databases
注意: databases
這個命令只存在在新版本中。數組
Mongodb的庫是隱式建立,你能夠use 一個不存在的庫
而後在該庫下建立collection,便可建立庫緩存
use databaseName
db.createCollection('collectionName')
collection一樣容許隱式建立:
db.collectionName.insert(json);
show tables/collections
db.collectionName.drop()
db.dropDatabase() # 選擇以後使用
show users
db.help() db.youColl.find().help();
介紹: mongodb存儲的是文檔,文檔是json格式的對象.
語法: db.collectionName.isnert(document);
# 增長單篇文檔,默認有一個ID db.collectionName.insert({title:'nice day'}); # 增長單個文檔,並指定_id db.collectionName.insert({_id:8,age:78,name:'lisi'}); # 增長多個文檔 db.collectionName.insert( [ {time:'friday',study:'mongodb'}, {_id:9,gender:'male',name:'QQ'} ] ) # insert 與 save的區別 : 若是插入的數據的_id相同,save將會更新該文檔,而insert將會報錯 > db.user.find(); { "_id" : 6, "sex" : "nan" } { "_id" : 1, "name" : "zxg" } { "_id" : 2, "name" : "user2", "age" : 2 } { "_id" : 3, "name" : "user3", "age" : 3 } > db.user.insert({_id:3,name:'zhouzhou'}); WriteResult({ "nInserted" : 0, "writeError" : { "code" : 11000, "errmsg" : "E11000 duplicate key error index: user.user.$_id_ dup key: { : 3.0 }" } }) > db.user.save({_id:3,name:'zhouzhou'}); WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.user.find(); { "_id" : 6, "sex" : "nan" } { "_id" : 1, "name" : "zxg" } { "_id" : 2, "name" : "user2", "age" : 2 } { "_id" : 3, "name" : "zhouzhou" }
語法: db.collection.remove(查詢表達式, 選項);
選項是指 {justOne:true/false},是否只刪一行, 默認爲false
注意
查詢表達式依然是個json對象
查詢表達式匹配的行,將被刪掉.
若是不寫查詢表達式,collections中的全部文檔將被刪掉. 在最新版本的mongodb,必需要寫表達式才能夠刪除
> db.user.find() { "_id" : 1, "name" : "user1","age" : 1 } { "_id" : 2, "name" : "user2","age" : 2 } { "_id" : 3, "name" : "user3","age" : 3 } { "_id" : 4, "name" : "user4","age" : 4 } { "_id" : 5, "name" : "user5","age" : 5 } { "_id" : 6, "sex" : "nan" } > db.user.remove({name:/user*/i},1) # 能夠經過正則刪除,而且只刪除第1行 > db.user.find() { "_id" : 2, "name" : "user2","age" : 2 } { "_id" : 3, "name" : "user3","age" : 3 } { "_id" : 4, "name" : "user4","age" : 4 } { "_id" : 5, "name" : "user5","age" : 5 } { "_id" : 6, "sex" : "nan" } > db.user.remove({name:/user*/i}); # 刪除全部user開頭的 > db.user.remove({age:{$gte:4}}); # 刪除年齡大於或等於4的,這裏的查詢表達式參考下文的find部分,會有詳細的說明
語法: db.collection.update(criteria,objNew,upsert,multi)
criteria: 設置查詢條件,用於查詢哪些文檔須要被更新.這裏能夠組合很是複雜的查詢條件
objNew: 更新後的對象
upsert: 設置爲真的時候若是記錄已經存在,更新它,不然新增一個記錄 默認爲false
multi: 設置爲真的時候,將會更新全部符合查詢條件的文檔.在mongodb中默認狀況下只會更新第一條符合的文檔.
1.錯誤的更改
> db.user.find(); { "_id" : 6, "sex" : "nan" } { "_id" : 1, "name" : "user1", "age" : 1 } { "_id" : 2, "name" : "user2", "age" : 2 } { "_id" : 3, "name" : "user3", "age" : 3 } > db.user.update({name:'user1'},{name:'zxg'}); WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.user.find(); { "_id" : 6, "sex" : "nan" } { "_id" : 1, "name" : "zxg" } { "_id" : 2, "name" : "user2", "age" : 2 } { "_id" : 3, "name" : "user3", "age" : 3 } > db.user.update({name:'xb'},{name:'jyh'},1); # 沒有就添加 WriteResult({ "nMatched" : 0, "nUpserted" : 1, # upserted 表示更新失敗後插入; "nModified" : 0, "_id" : ObjectId("55bf37d6ea4ed1b30ffb368d") }) { "_id" : ObjectId("55bf3480ea4ed1b30ffb368c"), "name" : "jyh" } > db.user.update({name:'jyh'},{name:'zxg'},1,1); #所有更改,可是報錯,多條更新必需要有表達式 "writeError" : { "code" : 9, "errmsg" : "multi update only works with $ operators" }
結果: 文檔中的其餘列也不見了,改後只有_id和name列了.
即--新文檔直接替換了舊文檔,而不是修改
2.經過修改表達式正確修改
$set # 當文檔中包含該字段的時候,更新該字段,若是該文檔中沒有該字段,則爲本文檔添加一個字段. $unset # 刪除文檔中的一個字段. $rename # 重命名某個列 $inc # 增加某個列 $setOnInsert # 當upsert爲true時,而且發生了insert操做時,能夠補充的字段 $push # 將一個數字存入一個數組,分爲三種狀況,若是該字段存在,則直接將數字存入數組.若是該字段不存在,建立字段而且將數字插入該數組.若是更新的字段不是數組,會報錯的. $pushAll # 將多個數值一次存入數組.上面的push只能一個一個的存入 $addToSet # 與$push功能相同將一個數字存入數組,不一樣的是若是數組中有這個數字,將不會插入,只會插入新的數據,一樣也會有三種狀況,與$push相同. $pop #刪除數組最後一個元素 $pull # 刪除數組中的指定的元素,若是刪除的字段不是數組,會報錯 $pullAll # 刪除數組中的多個值,跟pushAll與push的關係相似.
update有以上條件操做符之後才能使用第4參數進行多文檔更新操做;
# set 僅更改文檔中某列的值 db.user.update({name:'user1'},{$set:{name:'zxg'}},0,1); # 把全部name爲user1的更改成zxg,僅更改此列 # unset 刪除文檔某一列 db.user.update({name:'zxg'},{$unset:{age:1}}) # 把name爲zxg的列的列名name更改成xm db.user.update({name:'zxg'},{$rename: {name:'xm'}}) # 減小年齡1歲 db.user.update({name:'user2'},{$inc:{age:-1}}); # 增加年齡1歲 db.user.update({name:'user2'},{$inc:{age:1}}); # 更新_id爲7的文檔,若是該文檔不存在就建立並增長work字段,並指定值(可多個值指定),update第三參數upsert必須爲true; db.user.update({_id:7},{$setOnInsert:{work:'go on'}},1) WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 7 })
# $push db.test.find() { "_id" : 1, "ary" : [ 1, 2, 3, 4 ] } { "_id" : 2, "text" : "test" } db.test.update({_id:1},{$push:{ary:5}}) # 數組存在 直接壓入,可是這個地方若是是數組的話就壓入一個數組,並不是是合併數組中的元素 db.test.update({_id:1},{$push:{ary:[8,9,10]}}) db.test.find() { "_id" : 2, "text" : "test" } { "_id" : 1, "ary" : [ 1, 2, 3, 4, 5,[8,9,10] ] } # 因而可知push一次只能插入一個字段,若是想要批量插入的話就緩存pushAll; db.test.update({_id:2},{$push:{ary:6}}) # 數組不存在,建立數組並存入 db.test.find() { "_id" : 2, "ary" : [ 6 ], "text" : "test" } { "_id" : 1, "ary" : [ 1, 2, 3, 4, 5 ] } db.test.update({_id:2},{$push:{text:6}}) # 更新字段存在但不是數組報錯 Cannot apply $push/$pushAll modifier to non-array # pop db.user.update({_id:9},{$pop:{test:0}}) # 這裏的test不管傳入什麼值,都是刪掉test數組的最後一個 # $pull db.user.update({_id:9},{$pull:{test:2}}) #這裏的test傳什麼值就刪掉什麼值
在查詢的同時進行更改
db.collection.findAndModify({ query: <document>, // 查詢過濾條件 sort: <document>, //若是多個文檔符合查詢過濾條件,將以該參數指定的排列方式選擇出排在首位的對象 remove: <boolean>, // Must specify either the remove or the update field. Removes the document specified in the query field. Set this to true to remove the selected document . The default is false. update: <document>, // Must specify either the remove or the update field. Performs an update of the selected document. The update field employs the same update operators or field: value specifications to modify the selected document. new: <boolean>, // Optional. When true, returns the modified document rather than the original. The findAndModify() method ignores the new option for remove operations. The default is false. fields: <document>, //Optional. A subset of fields to return. The fields document specifies an inclusion of a field with 1, as in: fields: { <field1>: 1, <field2>: 1, ... } upsert: <boolean> //Optional. Used in conjunction with the update field. When true, findAndModify() creates a new document if no document matches the query, or if documents match the query, findAndModify() performs an update. To avoid multiple upserts, ensure that the query fields are uniquely indexed.The default is false. });
db.people.findAndModify({ query: { name: "Tom", state: "active", rating: { $gt: 10 } }, sort: { rating: 1 }, update: { $inc: { score: 1 } } }) db.runCommand({ findandmodify : "users", query: {age: {$gte: 25}}, sort: {age: -1}, update: {$set: {name: 'a2'}, $inc: {age: 2}}, remove: true });
> db.unique.insert({id:0}); WriteResult({ "nInserted" : 1 }) > db.unique.findAndModify({update:{$inc:{id:1}} }) {"id" : 0 } > db.unique.findAndModify({update:{$inc:{id:1}} }) {"id" : 1 } //得到ID之後就插入到須要有自增ID的collection中
db.collection.find()
db.collection.find({filed:value})
db.user.find({name:"user0"},{age:1}) { "_id" : ObjectId("5198c286c686eb50e2c843b2"), "age" : 0 } { "_id" : ObjectId("5198c3cac686eb50e2c843bd"), "age" : 20 } #_id是默認顯示的,能夠傳入_id:0來隱藏它
$ne
db.collection.find({filed:{$ne:value}})
$nin
db.collection.find({filed:{$nin:[value1,value2,value3]}})
$all $in
$all
數組中必須包含全部給定的查詢的元素
$in
數組中只要包含給定的查詢元素就能夠
> db.phone.find() { "_id" : ObjectId("5198e20220c9b0dc40419385"), "num" : [ 1, 2, 3 ] } { "_id" : ObjectId("5198e21820c9b0dc40419386"), "num" : [ 4, 2, 3 ] } { "_id" : ObjectId("5198e22120c9b0dc40419387"), "num" : [ 1, 2, 5 ] } > db.phone.find({num:{$all:[1,2]}}) { "_id" : ObjectId("5198e20220c9b0dc40419385"), "num" : [ 1, 2, 3 ] } { "_id" : ObjectId("5198e22120c9b0dc40419387"), "num" : [ 1, 2, 5 ] } > db.phone.find({num:{$all:[1,4]}}) # 同時包含1,4的沒有數據 > db.phone.find({num:{$in:[1,4]}}) # 包含1或4的數據 { "_id" : ObjectId("5198e20220c9b0dc40419385"), "num" : [ 1, 2, 3 ] } { "_id" : ObjectId("5198e21820c9b0dc40419386"), "num" : [ 4, 2, 3 ] } { "_id" : ObjectId("5198e22120c9b0dc40419387"), "num" : [ 1, 2, 5 ] }
$exists
> db.phone.find() { "_id" : ObjectId("5198e20220c9b0dc40419385"), "num" : [ 1, 2, 3 ] } { "_id" : ObjectId("5198e21820c9b0dc40419386"), "num" : [ 4, 2, 3 ] } { "_id" : ObjectId("5198e22120c9b0dc40419387"), "num" : [ 1, 2, 5 ] } { "_id" : ObjectId("5198e51a20c9b0dc40419388"), "state" : 1 } > db.phone.find({state:{$exists:1}}) # 存在state字段的 { "_id" : ObjectId("5198e51a20c9b0dc40419388"), "state" : 1 } > db.phone.find({state:{$exists:0}}) # 不存在state字段的文檔 { "_id" : ObjectId("5198e20220c9b0dc40419385"), "num" : [ 1, 2, 3 ] } { "_id" : ObjectId("5198e21820c9b0dc40419386"), "num" : [ 4, 2, 3 ] } { "_id" : ObjectId("5198e22120c9b0dc40419387"), "num" : [ 1, 2, 5 ] }
$mod
> db.user.find() { "_id" : ObjectId("5198c286c686eb50e2c843b2"), "name" : "user0", "age" : 0 } { "_id" : ObjectId("5198c286c686eb50e2c843b3"), "name" : "user1", "age" : 1 } { "_id" : ObjectId("5198c286c686eb50e2c843b4"), "name" : "user2", "age" : 2 } { "_id" : ObjectId("5198c286c686eb50e2c843b5"), "name" : "user3", "age" : 3 } { "_id" : ObjectId("5198c286c686eb50e2c843b6"), "name" : "user4", "age" : 4 } { "_id" : ObjectId("5198c286c686eb50e2c843b7"), "name" : "user5", "age" : 5 } { "_id" : ObjectId("5198c286c686eb50e2c843b8"), "name" : "user6", "age" : 6 } { "_id" : ObjectId("5198c286c686eb50e2c843b9"), "name" : "user7", "age" : 7 } { "_id" : ObjectId("5198c286c686eb50e2c843ba"), "name" : "user8", "age" : 8 } { "_id" : ObjectId("5198c286c686eb50e2c843bb"), "name" : "user9", "age" : 9 } { "_id" : ObjectId("5198c286c686eb50e2c843bc"), "name" : "user10", "age" : 10 } { "_id" : ObjectId("5198c3cac686eb50e2c843bd"), "name" : "user0", "age" : 20 } > db.user.find({age:{$mod:[3,1]}}) # 模三餘一 { "_id" : ObjectId("5198c286c686eb50e2c843b3"), "name" : "user1", "age" : 1 } { "_id" : ObjectId("5198c286c686eb50e2c843b6"), "name" : "user4", "age" : 4 } { "_id" : ObjectId("5198c286c686eb50e2c843b9"), "name" : "user7", "age" : 7 } { "_id" : ObjectId("5198c286c686eb50e2c843bc"), "name" : "user10", "age" : 10 }
一樣使用 db.user.find("this.age%3==1")這個語句也能達到上面的效果,可是不推薦.
$or
> db.user.find() { "_id" : ObjectId("5198c286c686eb50e2c843b2"), "name" : "user0", "age" : 0 } { "_id" : ObjectId("5198c286c686eb50e2c843b3"), "name" : "user1", "age" : 1 } { "_id" : ObjectId("5198c286c686eb50e2c843b4"), "name" : "user2", "age" : 2 } { "_id" : ObjectId("5198c286c686eb50e2c843b5"), "name" : "user3", "age" : 3 } { "_id" : ObjectId("5198c286c686eb50e2c843b6"), "name" : "user4", "age" : 4 } { "_id" : ObjectId("5198c286c686eb50e2c843b7"), "name" : "user5", "age" : 5 } { "_id" : ObjectId("5198c286c686eb50e2c843b8"), "name" : "user6", "age" : 6 } { "_id" : ObjectId("5198c286c686eb50e2c843b9"), "name" : "user7", "age" : 7 } { "_id" : ObjectId("5198c286c686eb50e2c843ba"), "name" : "user8", "age" : 8 } { "_id" : ObjectId("5198c286c686eb50e2c843bb"), "name" : "user9", "age" : 9 } { "_id" : ObjectId("5198c286c686eb50e2c843bc"), "name" : "user10", "age" : 10 } { "_id" : ObjectId("5198c3cac686eb50e2c843bd"), "name" : "user0", "age" : 20 } > db.user.find({$or:[{name:"user1"},{age:20}]}) # 因而可知or的鍵值爲一個數組 { "_id" : ObjectId("5198c286c686eb50e2c843b3"), "name" : "user1", "age" : 1 } { "_id" : ObjectId("5198c3cac686eb50e2c843bd"), "name" : "user0", "age" : 20 }
$nor
> db.user.find({$nor:[{name:"user1"},{age:20}]}) # name不等於user1,以及age不等於20,能夠理解爲排除; { "_id" : ObjectId("5198c286c686eb50e2c843b2"), "name" : "user0", "age" : 0 } { "_id" : ObjectId("5198c286c686eb50e2c843b4"), "name" : "user2", "age" : 2 } { "_id" : ObjectId("5198c286c686eb50e2c843b5"), "name" : "user3", "age" : 3 } { "_id" : ObjectId("5198c286c686eb50e2c843b6"), "name" : "user4", "age" : 4 } { "_id" : ObjectId("5198c286c686eb50e2c843b7"), "name" : "user5", "age" : 5 } { "_id" : ObjectId("5198c286c686eb50e2c843b8"), "name" : "user6", "age" : 6 } { "_id" : ObjectId("5198c286c686eb50e2c843b9"), "name" : "user7", "age" : 7 } { "_id" : ObjectId("5198c286c686eb50e2c843ba"), "name" : "user8", "age" : 8 } { "_id" : ObjectId("5198c286c686eb50e2c843bb"), "name" : "user9", "age" : 9 } { "_id" : ObjectId("5198c286c686eb50e2c843bc"), "name" : "user10", "age" : 10 }
$size
> db.phone.find() { "_id" : ObjectId("5198e20220c9b0dc40419385"), "num" : [ 1, 2, 3 ] } { "_id" : ObjectId("5198e21820c9b0dc40419386"), "num" : [ 4, 2, 3 ] } { "_id" : ObjectId("5198e22120c9b0dc40419387"), "num" : [ 1, 2, 5 ] } { "_id" : ObjectId("5198e51a20c9b0dc40419388"), "state" : 1 } { "_id" : ObjectId("519969952b76790566165de2"), "num" : [ 2, 3 ] } > db.phone.find({num:{$size:4}}) # num數組長度爲4的結果沒有 > db.phone.find({num:{$size:3}}) # 長度爲3的有三個 { "_id" : ObjectId("5198e20220c9b0dc40419385"), "num" : [ 1, 2, 3 ] } { "_id" : ObjectId("5198e21820c9b0dc40419386"), "num" : [ 4, 2, 3 ] } { "_id" : ObjectId("5198e22120c9b0dc40419387"), "num" : [ 1, 2, 5 ] }
$where
由bson轉換爲json,而後再經過回調函數去判斷,性能不好,能不用盡可能別用
> db.user.find() { "_id" : ObjectId("5198c286c686eb50e2c843b2"), "name" : "user0", "age" : 0 } { "_id" : ObjectId("5198c286c686eb50e2c843b3"), "name" : "user1", "age" : 1 } { "_id" : ObjectId("5198c286c686eb50e2c843b4"), "name" : "user2", "age" : 2 } { "_id" : ObjectId("5198c286c686eb50e2c843b5"), "name" : "user3", "age" : 3 } { "_id" : ObjectId("5198c286c686eb50e2c843b6"), "name" : "user4", "age" : 4 } { "_id" : ObjectId("5198c286c686eb50e2c843b7"), "name" : "user5", "age" : 5 } { "_id" : ObjectId("5198c286c686eb50e2c843b8"), "name" : "user6", "age" : 6 } { "_id" : ObjectId("5198c286c686eb50e2c843b9"), "name" : "user7", "age" : 7 } { "_id" : ObjectId("5198c286c686eb50e2c843ba"), "name" : "user8", "age" : 8 } { "_id" : ObjectId("5198c286c686eb50e2c843bb"), "name" : "user9", "age" : 9 } { "_id" : ObjectId("5198c286c686eb50e2c843bc"), "name" : "user10", "age" : 10 } { "_id" : ObjectId("5198c3cac686eb50e2c843bd"), "name" : "user0", "age" : 20 } > db.user.find({$where:function(){return this.age == 3 || this.age == 4}}) # 回調,進入了隱式迭代,而後符合條件的才返回; { "_id" : ObjectId("5198c286c686eb50e2c843b5"), "name" : "user3", "age" : 3 } { "_id" : ObjectId("5198c286c686eb50e2c843b6"), "name" : "user4", "age" : 4 } # 現在的新版本也能夠直接寫where條件 db.goods.find({$where:'this.cat_id != 3 && this.cat_id != 11'});
$type
在mongodb中每一種數據類型都有對應的數字,咱們在使用$type的時候須要使用這些數字,文檔中給出以下的表示
|類型|編號|
|:-:|:-:|
|雙精度|1|
|字符串|2|
|對象|3|
|數組|4|
|二進制數據|5|
|對象 ID|7|
|布爾值|8|
|日期|9|
|空|10|
|正則表達式|11|
|JavaScript|13|
|符號|14|
|JavaScript(帶範圍)|15|
|32 位整數|16|
|時間戳|17|
|64 位整數|18|
|最小鍵|255|
|最大鍵|127|
> db.user.find() { "_id" : ObjectId("5198c286c686eb50e2c843b2"), "name" : "user0", "age" : 0 } { "_id" : ObjectId("5198c286c686eb50e2c843b3"), "name" : "user1", "age" : 1 } { "_id" : ObjectId("5198c286c686eb50e2c843b4"), "name" : "user2", "age" : 2 } { "_id" : ObjectId("5198c286c686eb50e2c843b5"), "name" : "user3", "age" : 3 } { "_id" : ObjectId("5198c286c686eb50e2c843b6"), "name" : "user4", "age" : 4 } { "_id" : ObjectId("5198c286c686eb50e2c843b7"), "name" : "user5", "age" : 5 } { "_id" : ObjectId("5198c286c686eb50e2c843b8"), "name" : "user6", "age" : 6 } { "_id" : ObjectId("5198c286c686eb50e2c843b9"), "name" : "user7", "age" : 7 } { "_id" : ObjectId("5198c286c686eb50e2c843ba"), "name" : "user8", "age" : 8 } { "_id" : ObjectId("5198c286c686eb50e2c843bb"), "name" : "user9", "age" : 9 } { "_id" : ObjectId("5198c286c686eb50e2c843bc"), "name" : "user10", "age" : 10 } { "_id" : ObjectId("5198c3cac686eb50e2c843bd"), "name" : "user0", "age" : 20 } { "_id" : ObjectId("51996ef22b76790566165e47"), "name" : 23, "age" : 33 } > db.user.find({name:{$type:1}}) # 查找name爲雙精度的文檔 { "_id" : ObjectId("51996ef22b76790566165e47"), "name" : 23, "age" : 33 }
正則的效率都知道的,得一一解析後再查找,因此效率也是很低;
> db.user.find({name:/user.*/i}) # 查詢name以user開頭不區分大小寫的文檔 > db.goods.find({goods_name:/諾基亞.*/},{goods_name:1}); # 以諾基亞開頭的商品
小於 $lt
大於 $gt
小於或等於 $lte
大於或等於 $gte
> db.user.find({age:{$gte:5}}).limit(3) # 限制返回的是三條數據 { "_id" : ObjectId("5198c286c686eb50e2c843b7"), "name" : "user5", "age" : 5 } { "_id" : ObjectId("5198c286c686eb50e2c843b8"), "name" : "user6", "age" : 6 } { "_id" : ObjectId("5198c286c686eb50e2c843b9"), "name" : "user7", "age" : 7 }
使用到skip 和limit方法.skip表示跳過前面的幾個文檔,limit表示顯示幾個文檔.
> db.user.find() { "_id" : ObjectId("5198c286c686eb50e2c843b2"), "name" : "user0", "age" : 0 } { "_id" : ObjectId("5198c286c686eb50e2c843b3"), "name" : "user1", "age" : 1 } { "_id" : ObjectId("5198c286c686eb50e2c843b4"), "name" : "user2", "age" : 2 } { "_id" : ObjectId("5198c286c686eb50e2c843b5"), "name" : "user3", "age" : 1 } { "_id" : ObjectId("5198c286c686eb50e2c843b6"), "name" : "user4", "age" : 1 } { "_id" : ObjectId("5198c286c686eb50e2c843b7"), "name" : "user5", "age" : 2 } > db.user.find().skip(2).limit(3) # 跳過前兩個文檔查詢後面的三個文檔,通過測試這兩個方法的使用順序沒有影響 { "_id" : ObjectId("5198c286c686eb50e2c843b4"), "name" : "user2", "age" : 2 } { "_id" : ObjectId("5198c286c686eb50e2c843b5"), "name" : "user3", "age" : 1 } { "_id" : ObjectId("5198c286c686eb50e2c843b6"), "name" : "user4", "age" : 1 } > db.user.find().limit(3).skip(2) { "_id" : ObjectId("5198c286c686eb50e2c843b4"), "name" : "user2", "age" : 2 } { "_id" : ObjectId("5198c286c686eb50e2c843b5"), "name" : "user3", "age" : 1 } { "_id" : ObjectId("5198c286c686eb50e2c843b6"), "name" : "user4", "age" : 1 }
在mongodb中排序很簡單,使用sort方法,傳遞給它你想按照哪一個字段的哪一種方式排序便可.這裏1表明升序,-1表明降序.
> db.user.find() { "_id" : ObjectId("5198c286c686eb50e2c843b2"), "name" : "user0", "age" : 0 } { "_id" : ObjectId("5198c286c686eb50e2c843b3"), "name" : "user1", "age" : 1 } { "_id" : ObjectId("5198c286c686eb50e2c843b4"), "name" : "user2", "age" : 2 } { "_id" : ObjectId("5198c286c686eb50e2c843b5"), "name" : "user3", "age" : 3 } { "_id" : ObjectId("5198c286c686eb50e2c843b6"), "name" : "user4", "age" : 4 } { "_id" : ObjectId("5198c286c686eb50e2c843b7"), "name" : "user5", "age" : 5 } > db.user.find().sort({age:1}) { "_id" : ObjectId("5198c286c686eb50e2c843b2"), "name" : "user0", "age" : 0 } { "_id" : ObjectId("5198c286c686eb50e2c843b3"), "name" : "user1", "age" : 1 } { "_id" : ObjectId("5198c286c686eb50e2c843b4"), "name" : "user2", "age" : 2 } { "_id" : ObjectId("5198c286c686eb50e2c843b5"), "name" : "user3", "age" : 3 } { "_id" : ObjectId("5198c286c686eb50e2c843b6"), "name" : "user4", "age" : 4 } { "_id" : ObjectId("5198c286c686eb50e2c843b7"), "name" : "user5", "age" : 5 } > db.user.find().sort({age:-1}) { "_id" : ObjectId("5198c286c686eb50e2c843b7"), "name" : "user5", "age" : 5 } { "_id" : ObjectId("5198c286c686eb50e2c843b6"), "name" : "user4", "age" : 4 } { "_id" : ObjectId("5198c286c686eb50e2c843b5"), "name" : "user3", "age" : 3 } { "_id" : ObjectId("5198c286c686eb50e2c843b4"), "name" : "user2", "age" : 2 } { "_id" : ObjectId("5198c286c686eb50e2c843b3"), "name" : "user1", "age" : 1 } { "_id" : ObjectId("5198c286c686eb50e2c843b2"), "name" : "user0", "age" : 0 }
mongodb中的group能夠實現相似關係型數據庫中的分組的功能,可是mongodb中的group遠比關係型數據庫中的group強大,能夠實現map-reduce功能,關於什麼是map-reduce,會在後續大數據專題裏面說明,這裏先略過,感興趣的朋友能夠百度
group中的json參數相似這樣{key:{字段:1},initial:{變量:初始值},$reduce:function(doc,prev){函數代碼}}.
其中的字段表明,須要按哪一個字段分組.
變量表示這一個分組中會使用的變量,而且給一個初始值.能夠在後面的$reduce函數中使用.$reduce
的兩個參數,分別表明當前的文檔和上個文檔執行完函數後的結果.以下咱們按年齡分組,同級不一樣年齡的用戶的多少:
> db.user.find() { "_id" : ObjectId("5198c286c686eb50e2c843b2"), "name" : "user0", "age" : 0 } { "_id" : ObjectId("5198c286c686eb50e2c843b3"), "name" : "user1", "age" : 1 } { "_id" : ObjectId("5198c286c686eb50e2c843b4"), "name" : "user2", "age" : 2 } { "_id" : ObjectId("5198c286c686eb50e2c843b5"), "name" : "user3", "age" : 1 } { "_id" : ObjectId("5198c286c686eb50e2c843b6"), "name" : "user4", "age" : 1 } { "_id" : ObjectId("5198c286c686eb50e2c843b7"), "name" : "user5", "age" : 2 } > db.user.group({key:{age:1},initial:{count:0},$reduce:function(doc,prev){prev.count++}}) [ { "age" : 0, "count" : 1 }, { "age" : 1, "count" : 3 }, { "age" : 2, "count" : 2 } ] > db.user.group({key:{age:1},initial:{users:[]},$reduce:function(doc,prev){prev.users.push(doc.name)}}); #因爲內部是使用js引擎來解析的,因此徹底能夠經過js語法來操做,這使得雖然mongodb的分組很麻煩但卻很靈活 [ { "age" : 0, "users" : [ "user0" ] }, { "age" : 1, "users" : [ "user1", "user3", "user4" ] }, { "age" : 2, "users" : [ "user2", "user5" ] } ] # 另外本函數還有兩個可選參數 condition 和 finalize # condition就是分組的條件篩選相似mysql中的having > db.user.group({key:{age:1},initial:{users:[]},$reduce:function(doc,prev){prev.users.push(doc.name)},condition:{age:{$gt:0}}}) # 篩選出age大於0的; [ { "age" : 1, "users" : [ "user1", "user3", "user4" ] }, { "age" : 2, "users" : [ "user2", "user5" ] } ]
> db.goods.count() #不傳參數就統計該集合的總數 31 > db.goods.count({cat_id:3}) # 統計cat_id=3的總數 15
> db.user.find() { "_id" : ObjectId("5198c286c686eb50e2c843b2"), "name" : "user0", "age" : 0 } { "_id" : ObjectId("5198c286c686eb50e2c843b3"), "name" : "user1", "age" : 1 } { "_id" : ObjectId("5198c286c686eb50e2c843b4"), "name" : "user2", "age" : 2 } { "_id" : ObjectId("5198c286c686eb50e2c843b5"), "name" : "user3", "age" : 1 } { "_id" : ObjectId("5198c286c686eb50e2c843b6"), "name" : "user4", "age" : 1 } { "_id" : ObjectId("5198c286c686eb50e2c843b7"), "name" : "user5", "age" : 2 } > db.user.distinct("age") # 略微有點特殊,傳入的參數直接是字符串,而不是對象; [ 0, 1, 2 ]
{ _id: 1, results: [ 82, 85, 88 ] } { _id: 2, results: [ 75, 88, 89 ] } db.scores.find( { results: { $elemMatch: { $gte: 80, $lt: 85 } } } #查詢results文檔中的元素同時知足即大於80而且又小於85的,注意此處只要其中一個元素知足這個查詢就會返回 ) { "_id" : 1, "results" : [ 82, 85, 88 ] }
> db.user.find(); { "_id" : ObjectId("55c070a02cc8cec37073a1d9"), "name" : "zxg", "age" : 28, "hobby" : { "life" : [ "電影", "小說", "漫畫" ], "work" : [ "發呆", "發呆2" ], "home" : "玩耍" } } { "_id" : ObjectId("55c070a52cc8cec37073a1da"), "name" : "jyh", "age" : 28, "hobby" : { "life" : [ "賣萌", "養兔子", "作家務" ], "work" : [ "鬱悶", "鬱悶2" ], "home" : "賣萌" } } { "_id" : ObjectId("55c072db2cc8cec37073a1db"), "name" : "jyh", "age" : 28, "hobby" : [ { "life" : [ "賣萌", "養兔子", "作家務" ] }, { "work" : [ "鬱悶", "鬱悶2" ] }, { "home" : "賣萌" } ] } > db.user.find({hobby:{$elemMatch:{home:'賣萌'}}}) # 注意上文的結構,必須是要在數組中才能夠查出 { "_id" : ObjectId("55c072db2cc8cec37073a1db"), "name" : "jyh", "age" : 28, "hobby" : [ { "life" : [ "賣萌", "養兔子", "作家務" ] }, { "work" : [ "鬱悶", "鬱悶2" ] }, { "home" : "賣萌" } ] } > db.user.find({'hobby.home':'賣萌'}) # 注意,hobby.home相似js中對象與屬性的操做方式,可是要加上引號,不然會報錯 { "_id" : ObjectId("55c070a52cc8cec37073a1da"), "name" : "jyh", "age" : 28, "hobby" : { "life" : [ "賣萌", "養兔子", "作家務" ], "work" : [ "鬱悶", "鬱悶2" ], "home" : "賣萌" } } { "_id" : ObjectId("55c072db2cc8cec37073a1db"), "name" : "jyh", "age" : 28, "hobby" : [ { "life" : [ "賣萌", "養兔子", "作家務" ] }, { "work" : [ "鬱悶", "鬱悶2" ] }, { "home" : "賣萌" } ] }
如下查詢基於ecshop網站的數據查詢
# 本店價格低於或等於100元的商品($lte) db.goods.find({shop_price:{$lte:100}},{goods_name:1,shop_price:1}); # 取出第4欄目或第11欄目的商品($in) db.goods.find({cat_id:{$in:[4,11]}},{goods_name:1,shop_price:1}); # 取出100<=價格<=500的商品($and) db.goods.find({$and:[{'shop_price':{$gte:100}},{'shop_price':{$lte:500}}]},{_id:0,shop_price:1}) # 取出不屬於第3欄目且不屬於第11欄目的商品($and $nin和$nor分別實現) db.goods.find({$and:[{cat_id:{$ne:3}},{cat_id:{$ne:11}}]},{_id:0,cat_id:1}) db.goods.find({cat_id:{$nin:[3,11]}},{_id:0,cat_id:1}) db.goods.find({$nor:[{cat_id:3},{cat_id:11}]},{_id:0,cat_id:1}) # 取出價格大於100且小於300,或者大於2000且小於5000的商品() db.goods.find({$or:[{$and:[{shop_price:{$gt:100}}, {shop_price:{$lt:300} }]}, {$and:[{shop_price:{$gt:2000}}, {shop_price:{$lt:5000} }] } ] },{_id:0,shop_price:1} ) # 取出全部goods_id爲偶數的商品; db.goods.find({goods_id:{$mod:[2,0]}},{_id:0,goods_id:1})