摘要:表達式是無狀態的,只能用于計算當前聚合管道的文檔,不能處理其它的文檔。可以用來重命名增加或刪除域,也可以用于創建計算結果以及嵌套文檔用于過濾數據,只輸出符合條件的文檔。
1.下載安裝
1.1.首先去官網下載mongodb對應版本安裝
https://www.mongodb.com/download-center
?????解壓到目錄 例如:c:/mongo
?????創建文件夾用于mongodb數據存儲和日志存儲 例如:c:/mongo/data/db c:/mongo/data/log
1.2.初始化數據庫
?????打開控制臺cd到bin目錄下或者將bin目錄配置到環境變量
> cd c:/mongo/bin > mongod –dbpath=../data/db –port=27017
?????數據庫啟動成功 mongodb默認端口為27017
C:Usersmaikuraki>mongod --dbpath=c:/mongo/data/db -port=27017 2018-01-27T20:36:55.680+0800 I CONTROL [initandlisten] MongoDB starting : pid=9364 port=27017 dbpath=c:/mongo/data/db 64-bit host=MySurface 2018-01-27T20:36:55.682+0800 I CONTROL [initandlisten] targetMinOS: Windows Vista/Windows Server 2008 2018-01-27T20:36:55.682+0800 I CONTROL [initandlisten] db version v3.2.4 2018-01-27T20:36:55.683+0800 I CONTROL [initandlisten] git version: e2ee9ffcf9f5a94fad76802e28cc978718bb7a30 2018-01-27T20:36:55.683+0800 I CONTROL [initandlisten] allocator: tcmalloc 2018-01-27T20:36:55.683+0800 I CONTROL [initandlisten] modules: none 2018-01-27T20:36:55.683+0800 I CONTROL [initandlisten] build environment: 2018-01-27T20:36:55.683+0800 I CONTROL [initandlisten] distarch: x86_64 2018-01-27T20:36:55.683+0800 I CONTROL [initandlisten] target_arch: x86_64 2018-01-27T20:36:55.683+0800 I CONTROL [initandlisten] options: { net: { port: 27017 }, storage: { dbPath: "c:/mongo/data/db" } } 2018-01-27T20:36:55.684+0800 I - [initandlisten] Detected data files in c:/mongo/data/db created by the "wiredTiger" storage engine, so setting the active storage engine to "wiredTiger". 2018-01-27T20:36:55.685+0800 I STORAGE [initandlisten] wiredtiger_open config: create,cache_size=1G,session_max=20000,eviction=(threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000),checkpoint=(wait=60,log_size=2GB),statistics_log=(wait=0), 2018-01-27T20:36:56.618+0800 I NETWORK [HostnameCanonicalizationWorker] Starting hostname canonicalization worker 2018-01-27T20:36:56.618+0800 I FTDC [initandlisten] Initializing full-time diagnostic data capture with directory "c:/mongo/data/db/diagnostic.data" 2018-01-27T20:36:56.624+0800 I NETWORK [initandlisten] waiting for connections on port 27017 2018-01-27T20:37:12.505+0800 I NETWORK [initandlisten] connection accepted from 127.0.0.1:61372 #1 (1 connection now open)
數據庫啟動成功
1.3.連接數據庫
?????新開一個控制臺cd到bin目錄下
> mongo 127.0.0.1
?????連接成功后進入shell模式 按ctrl+c退出
?????默認會用test
C:Usersmaikuraki>mongo 127.0.0.1 MongoDB shell version: 3.2.4 connecting to: 127.0.0.1/test >2.mongodb基本操作 1.查看數據庫列表
> show dbs I1 0.000GB ci 0.000GB local 0.000GB user 0.000GB >2.選擇或創建數據庫進入
選擇的數據庫不一定要存在 如果沒有該數據庫mongodb會在緩存中創建,當存入數據后才會正在創建
> use user switched to db user >3.增加插入數據 (create)
創建一個集合叫persion
db.createCollection("persion")
如果沒有創建也可以直接插入保存一條數據,mongodb會自動創建persion的集合
> db.persion.save({name: "json"}) >
在庫中插入一條persion的集合增加一條{name: "tom"}的數據
> db.persion.insert({name: "tom"}) >
**save和insert的區別:若新增的數據中存在主鍵 ,insert() 會提示錯誤,而save()
則更改原來的內容為新內容。**
> show collections chats persion users >5.查看剛剛添加的集合中內容 (retrieve)
db.[documentName].find()查找集合中的所有數據
> db.persion.find() { "_id" : ObjectId("5a6c7a7bcbeb9ed70a40a5bc"), "name" : "json" } //mongodb會自動創建一條_id的索引 { "_id" : ObjectId("5a6c7938cbeb9ed70a40a5bb"), "name" : "tom" } >
db.[documentName].findOne()查找集合中的一條數據
> db.persion.findOne() { "_id" : ObjectId("5a6c7a7bcbeb9ed70a40a5bc"), "name" : "json" } >
db.[documentName].find().count()統計集合中的數據條數
6.更新數據(update)db.[documentName].update({查詢條件},{更新內容})
把剛剛插入的name叫tom的更新成tom2
> db.persion.update({name: "tom"},{name: "tom2"}) > db.persion.find() { "_id" : ObjectId("5a6c7a7bcbeb9ed70a40a5bc"), "name" : "json" } { "_id" : ObjectId("5a6c7938cbeb9ed70a40a5bb"), "name" : "tom2" } >
如果查詢條件的字段和要修改的字段不同則需要修改器
db.[documentName].update({查詢條件},{$set: {更新內容}})
> db.persion.update({name: "張三"},{$set:{age: 24}}) > db.persion.find() }) { "_id" : ObjectId("5a6c8227cbeb9ed70a40a5bd"), "age" : 24 } //這條是沒有使用修改器修改 結果name屬性沒有了 { "_id" : ObjectId("5a6c8280cbeb9ed70a40a5be"), "name" : "張三", "age" : 24 } >
更新所有符合要求的數據
db.[documentName].update({查詢條件},{$set: {更新內容}},{multi,true})
> db.persion.update({name: "張三"},{$set:{age: 24}},{multi,true}) >7.刪除(delete)
刪除庫中的集合
db.[documentName].drop()
> db.persion.drop()
刪除集合下的所有數據
db.[documentName].remove({})
> db.persion.remove({})
刪除集合下的某一條數據
db.[documentName].remove({查詢條件})
> db.persion.remove({name: "張三"})
刪除數據庫
> db.dropDatabase()8.數據庫命名規范
不能是空字符串
不能含有" "(空格)、,、$、/、、和O(空字符)
應該全部小寫
最多64個字節
不能與現有庫同名
帶有符號的如db-foo這樣的不能通過db.[documentName]獲取需要用db.getCollection(documentName)獲取(-會被當成減號)
3.mongodb高級操作 1.直接執行javascriptmongodb的shell可以執行javascript
用for循環批量插入
> for(var i = 0;i < 10; i ++){ ... db.persion.insert({name: "tom_"+ i}) ... } > db.persion.find() { "_id" : ObjectId("5a6c8a80c70097e60431ebc9"), "name" : "tom_0" } { "_id" : ObjectId("5a6c8a80c70097e60431ebca"), "name" : "tom_1" } { "_id" : ObjectId("5a6c8a80c70097e60431ebcb"), "name" : "tom_2" } { "_id" : ObjectId("5a6c8a80c70097e60431ebcc"), "name" : "tom_3" } { "_id" : ObjectId("5a6c8a80c70097e60431ebcd"), "name" : "tom_4" } { "_id" : ObjectId("5a6c8a80c70097e60431ebce"), "name" : "tom_5" } { "_id" : ObjectId("5a6c8a80c70097e60431ebcf"), "name" : "tom_6" } { "_id" : ObjectId("5a6c8a80c70097e60431ebd0"), "name" : "tom_7" } { "_id" : ObjectId("5a6c8a80c70097e60431ebd1"), "name" : "tom_8" } { "_id" : ObjectId("5a6c8a80c70097e60431ebd2"), "name" : "tom_9" } >2.update參數
設置參數為true,當查詢不到的時候則自動insert一條數據如果查詢到則做update操作
> db.persion.update({_id: 1},{_id: 1, name: "tom"}, true)
insertOrUpdate之后再加true參數 需要配合$set修改器使用
> db.persion.update({_id: 1},{$set:{_id: 1, name: "tom"}}, fasle, true)3.修改器
修改器 | 功能 |
---|---|
$inc | 對指定的鍵做加法操作,如果指定的關鍵不存在,則新創建這個鍵,并且賦值為$inc指定的值 |
$set | 給指定的鍵賦值,如果指定的鍵不存在,則自動創建 |
$unset | 清除一個鍵和值 |
$push | 對數組進行操作,push將一個元素追加到集合的末尾(不管這個元素是否存在于數組中),如果數組不存在,則首先創建數組,如果鍵存在值不是數組類型則會報錯 |
$pushAll | push操作的批量版本,如果給push操作提供一個數組作為參數,那么push認為是把整個數組作為一個元素加入到指定的數組末尾 |
$addToSet | pushAll的去重版本,即$addToSet實現了Java的Set集合的特性(Set中不能包含相同的元素) |
$pop | 從數組中移除一個元素{$pop:{"key":1}}從數組末尾刪除;pop:{"key":-1}}從數組開頭刪除 |
$pull | 刪除數組中指定元素 |
$pullAll | 刪除數組中多個指定元素 |
$rename | 修改指定鍵的鍵名 |
案例
$inc
> db.persion.insert({name: "tom", age: 20}) > db.persion.find() { "_id" : ObjectId("5a6c93dec70097e60431ebd3"), "name" : "tom", "age" : 20 } //找到年齡為20的任何加上1 > db.persion.update({age: 20},{$inc:{age: 1}}) > db.persion.find() { "_id" : ObjectId("5a6c93dec70097e60431ebd3"), "name" : "tom", "age" : 21 }
$set
> db.persion.insert({name: "tom", age: 20}) > db.persion.find() { "_id" : ObjectId("5a6c93dec70097e60431ebd3"), "name" : "tom", "age" : 20 } //更新name: tom -> jack > db.persion.update({age: 20},{$set:{name: "jack"}}) > db.persion.find() { "_id" : ObjectId("5a6c93dec70097e60431ebd3"), "name" : "jack", "age" : 20 }
$unset
> db.persion.insert({name: "tom", age: 20}) > db.persion.find() { "_id" : ObjectId("5a6c93dec70097e60431ebd3"), "name" : "tom", "age" : 20 } //刪除name屬性 > db.persion.update({age: 20},{$unset:{name: ""}}) > db.persion.find() { "_id" : ObjectId("5a6c93dec70097e60431ebd3"), "age" : 20 }
$push
> db.persion.insert({_id: 1, arr: [1, 2, 3]}) > db.persion.find() { "_id" : 1, "arr" : [ 1, 2, 3 ] } //給arr屬性增加一個值 > db.persion.update({_id: 1}, {$push: {arr: 4}}) > db.persion.find() { "_id" : 1, "arr" : [ 1, 2, 3, 4 ] } >
$pushAll
> db.persion.update({_id: 1}, {$pushAll: {arr: [5,6,7]}}) > db.persion.find() { "_id" : 1, "arr" : [ 1, 2, 3, 4, 5, 6, 7 ] } >
$addToSet
如果數組中有該值則不會追加
{ "_id" : 1, "arr" : [ 1, 2, 3, 4, 5, 6, 7 ] } > db.persion.update({_id: 1}, {$addToSet: {arr: 1}}) > db.persion.find() { "_id" : 1, "arr" : [ 1, 2, 3, 4, 5, 6, 7 ] } > db.persion.update({_id: 1}, {$addToSet: {arr: 8}}) > db.persion.find() { "_id" : 1, "arr" : [ 1, 2, 3, 4, 5, 6, 7, 8 ] }
$pop
{ "_id" : 1, "arr" : [ 1, 2, 3 ] } > db.persion.update({_id:1},{$pop:{arr:1}}) > db.persion.find() { "_id" : 1, "arr" : [ 1, 2 ] } > { "_id" : 1, "arr" : [ 1, 2, 3 ] } > db.persion.update({_id:1},{$pop:{arr:-1}}) > db.persion.find() { "_id" : 1, "arr" : [ 2, 3 ] } >
$pull
{ "_id" : 1, "arr" : [ 1, 2, 3 ] } > db.persion.update({_id:1},{$pull:{arr:2}}) > db.persion.find() { "_id" : 1, "arr" : [ 1, 3 ] } >
$pullAll
{ "_id" : 1, "arr" : [ 1, 2, 3 ] } > db.persion.update({_id:1},{$pullAll:{arr:[2,3]}}) > db.persion.find() { "_id" : 1, "arr" : [ 1 ] } >
$rename
{ "_id" : 1, "arr" : [ 1, 2, 3 ] } > db.persion.update({_id:1},{$rename:{arr:"arr2"}}) > db.persion.find() { "_id" : 1, "arr2" : [ 1 ] } >4.高級查詢 1.指定返回的key
db.[documentName].find({條件},{key指定})
插入二十條測試數據
> for(var i=0;i < 20;i++){ ... db.persion.insert({name: "tom_"+i,age: 24+i,country: (i%2 == 0)?"USA":"China"}) ... }
查找country = USA的數據且只返回name(mongodb會默認返回_id,這里設置 _id:0不返還 _id)
> db.persion.find({country:"USA"},{_id:0,name:1}) { "name" : "tom_0" } { "name" : "tom_2" } { "name" : "tom_4" } { "name" : "tom_6" } { "name" : "tom_8" } { "name" : "tom_10" } { "name" : "tom_12" } { "name" : "tom_14" } { "name" : "tom_16" } { "name" : "tom_18" } >2.常用查詢條件 對比查詢
條件符 | 功能 | 示例 | 說明 |
---|---|---|---|
$gt | > | db.persion.find({age: {$gt: 28}}, {_id:0,name: 1}) | 查詢age大于28的記錄只返回name |
$gte | >= | db.persion.find({age: {$gte: 28}}, {_id:0,name: 1}) | 查詢age大于等于28的記錄只返回name |
$lt | < | db.persion.find({age: {$lt: 28}}, {_id:0,name: 1}) | 查詢age小于28的記錄 |
$lte | <= | db.persion.find({age: {$lte: 28}}, {_id:0,name: 1}) | 查詢age小于等于28的記錄 |
$ne | != | db.persion.find({country: {$ne: "USA"}}, {_id:0,name: 1}) | 查詢country不等于USA的記錄 |
$eq | = | db.persion.find({country: {$eq: "USA"}}, {_id:0,name: 1}) | 查詢country等于USA的記錄 |
$in | in | db.persion.find({country: {$in: ["USA","China"]}}, {_id:0,name: 1}) | 查詢country包含USA或China的記錄 |
$nin | not in | db.persion.find({country: {$nin: ["USA","China"]}}, {_id:0,name: 1}) | 查詢country不包含USA或China的記錄 |
條件符 | 功能 | 示例 | 說明 |
---|---|---|---|
$or | or | db.persion.find({$or: [{age: {$gt: 39}}, {age: {$lt: 28}}]}, {_id:0,name: 1}) | 查詢age大于39或者age小于28的記錄 |
$nor | not or | db.persion.find({$nor: [{age: {$gt: 39}}, {age: {$lt: 28}}]}, {_id:0,name: 1}) | 查詢age小于等于39且age大于等于28的記錄 |
$and | and | db.persion.find({$and: [{age: {$lt: 39}}, {age: {$gt: 28}}]}, {_id:0,name: 1}) | 查詢age大于28且age小于39的記錄等價于db.persion.find({age: {$gt: 28, $lt: 39}}, { _id:0,name: 1}) |
$not | not | db.persion.find({age: {$not: {$gt: 28}}}, { _id:0,name: 1}) | 查詢age不大于28的記錄 |
插入測試數據
> db.persion.insert({book: ["JS","PHP","JAVA"]}) > db.persion.insert({book: ["JS","PHP","JAVA","NODEJS"]})
條件符 | 功能 | 示例 | 說明 |
---|---|---|---|
$all | 查詢數組包含的 | db.persion.find({book:{$all: ["NODEJS"]}}) | 查詢所有集合中book數組里包含NODEJS的結果 |
$size | 查詢數組長度 | db.persion.find({book:{$size: 3}}) | 查詢所有集合中book數組長度為3的結果 |
$elemMatch | 組合查詢 | db.persion.find({book: {$elemMatch: {$in: ["PHP","NODEJS"]}}}) | 查找book中包含PHP或者NODEJS的結果 |
limit 返回指定數據條數
> db.persion.find({$or: [{country: "USA"},{country: "China"}]}).limit(5)
skip返回指定跨度的數據
跨越數據量大的時候會有性能問題
> db.persion.find({$or: [{country: "USA"},{country: "China"}]}).limit(5).skip(10)
sort 返回按照key排序的數據[1,-1]
> db.persion.find({$or: [{country: "USA"},{country: "China"}]}).limit(5).skip(10).sort({age: -1})游標
利用游標遍歷數據
var persions = db.persion.find(); while(persions.hasNext()) { obj = persions.next(); print(obj.name) }查詢快照
> db.persion.find({$query: {name: "tom_1"}, $snapshot: true})
高級查詢選項
$query
$orderby
$maxsan: integer最多掃描文檔數
$min: doc查詢開始
$max: doc查詢結束
$hint: doc使用哪個索引
$explain: boolean 統計
$snapshot: boolean 一致快照
[obj1, obj2, obj3, obj4]
游標讀取時obj1->obj2 當讀取到obj2時對obj2進行操作導致obj占用空間變大mongodb會將它放到最后此時排列為: [obj1, obj3, obj4, obj2]
游標接下去讀取將會讀到obj4此時obj3就漏讀了 使用快照可以避免這個問題
建立索引1正序-1倒敘
數量級大時提升查詢時間 但會影響插入時間
> db.persion.ensureIndex({age: 1},{background: true}) //后臺執行
建立索引并指定索引名稱
> db.persion.ensureIndex({age: 1}, {name: "ageIndex"})
唯一索引(不能插入重復值)
> db.persion.ensureIndex({age: 1}, {unique: true})
剔除重復數據
> db.persion.ensureIndex({age: 1}, {unique: true,dropDups: true})
查詢時指定索引
> db.persion.find({name: "tom"}).hint({age: -1})
查看查詢信息
> db.persion.find({name: "tom"}).expain()
查看索引
> db.system.indexes.find() > db.system.namespaces.find()
刪除索引
> db.runCommand({dropIndexes: "age", index: "ageIndex"}) > db.runCommand({dropIndexes: "age", index: "*"})4.空間索引(2D索引)
測試數據插入data中的每一條數據
var data = [ key: { x: 0, y: 0 }, key: { x: 10, y: 15, }, .... { x: 200, y: 300 } ]
> db.map.ensureIndex({key: "2d", {min: -1, max: 200})
建立空間索引后查詢距離(50, 100)最近的三個數據
> db.map.find({key: {$near: [50, 100]}}).limit(3)
查詢(50, 50)點和(200,200)點為對角線的正方形中所有的數據點
> db.map.find({key:{$widthin: {$box: [[50,50],[200,200]]}}})
查詢已(100,120)為圓心50為半徑內部的所有點數據
> db.map.find({key: {$widthin: {$center: [[100,120],50]}}})5.聚合(aggregate)
MongoDB中聚合主要用于處理數據(諸如統計平均值,求和等),并返回計算后的數據結果。
db.[documentName].aggregate(聚合選項)
插入測試數據
var data = [ { name: "tom", age: 22, favorite: ["JAVA", "NODE", "MONGO", "GO"] }, { name: "jack", age: 26, favorite: ["PHP", "MONGO", "GO"] }, { name: "bill", age: 23, favorite: ["PYTHON", "RUBY", "MYSQL", "GO","ANDROID"] }, { name: "james", age: 23, favorite: ["PHP", "MONGO", "GO"] } ] for(var i = 0;i < data.length; i++) { db.persion.insert(data[i]) }
條件符 | 功能 | 示例 | 說明 |
---|---|---|---|
$sum | 求和 | db.persion.aggregate([{$group: {\_id: "$age", num_total: {$sum: "$age"}}}]) | 以age為_id求所有age相同的數據中age的總和 |
$avg | 平均值 | db.persion.aggregate([{$group: {_id: "$favorite", avg: {$avg: "$age"}}}]) | 以favorite為_id求所有favorite相同的人的age平均值 |
$min | 集合中最小值 | db.presion.aggregate([{$group: {_id: "$favorite", min: {$min: "$age"}}}]) | 以favorite為_id求favorite相同的人里age最小的 |
$max | 集合中最小值 | db.presion.aggregate([{$group: {_id: "$favorite", max: {$max: "$age"}}}]) | 以favorite為_id求favorite相同的人里age最小的 |
$push | 在結果文檔中插入值到一個數組中 | db.persion.aggregate([{$group: {_id: "$favorite", _age: {$push: "$age"}}}]) | 統計所有favorite相同的人的age存入_age數組中 |
$addToSet | 在結果文檔中插入值到一個數組中,但不創建副本 | db.persion.aggregate([{$group: {_id: "$favorite", _age: {$addToSet: "$age"}}}]) | 統計所有favorite相同的人的age存入_age數組中,如果_age數組已存在相同的值則不會存入 |
$first | 根據資源文檔的排序獲取第一個文檔數據 | db.persion.aggregate([{$group: {_id: "$favorite", first_name: {$first: "$name"}}}]) | 相同favorite中第一個出現的人的name |
$last | 根據資源文檔的排序獲取第一個文檔數據 | db.persion.aggregate([{$group: {_id: "$favorite", first_name: {$last: "$name"}}}]) | 相同favorite中最后個出現的人的name |
$sum
> db.persion.aggregate([{$group: {_id: "$age", num_total: {$sum: "$age"}}}]) { "_id" : 23, "num_total" : 46 } //23出現兩次總和是46 { "_id" : 26, "num_total" : 26 } { "_id" : 22, "num_total" : 22 } >
$avg
> db.persion.aggregate([{$group: {_id: "$favorite", avg: {$avg: "$age"}}}]) { "_id" : [ "JAVA", "NODE", "MONGO", "GO" ], "avg" : 22 } { "_id" : [ "PHP", "MONGO", "GO" ], "avg" : 24.5 } { "_id" : [ "PYTHON", "RUBY", "MYSQL", "GO", "ANDROID" ], "avg" : 23 } >
$min
> db.persion.aggregate([{$group: {_id: "$favorite", min: {$min: "$age"}}}]) { "_id" : [ "JAVA", "NODE", "MONGO", "GO" ], "min" : 22 } { "_id" : [ "PHP", "MONGO", "GO" ], "min" : 23 } { "_id" : [ "PYTHON", "RUBY", "MYSQL", "GO", "ANDROID" ], "min" : 23 }
$max
> db.persion.aggregate([{$group: {_id: "$favorite", max: {$max: "$age"}}}]) { "_id" : [ "JAVA", "NODE", "MONGO", "GO" ], "max" : 22 } { "_id" : [ "PHP", "MONGO", "GO" ], "max" : 26 } { "_id" : [ "PYTHON", "RUBY", "MYSQL", "GO", "ANDROID" ], "max" : 23 } >
$push
再插入一條測試數據
> db.persion.insert({ name: "jam", age: 26, favorite: ["PHP", "MONGO", "GO"], _age: [23], })
> db.persion.aggregate([{$group: {_id: "$favorite", _age: {$push: "$age"}}}]) { "_id" : [ "JAVA", "NODE", "MONGO", "GO" ], "_age" : [ 22 ] } { "_id" : [ "PHP", "MONGO", "GO" ], "_age" : [ 26, 23, 26 ] } { "_id" : [ "PYTHON", "RUBY", "MYSQL", "GO", "ANDROID" ], "_age" : [ 23 ] } >
$addToSet
> db.persion.aggregate([{$group: {_id: "$favorite", _age: {$addToSet: "$age"}}}]) { "_id" : [ "JAVA", "NODE", "MONGO", "GO" ], "_age" : [ 22 ] } { "_id" : [ "PHP", "MONGO", "GO" ], "_age" : [ 23, 26 ] } { "_id" : [ "PYTHON", "RUBY", "MYSQL", "GO", "ANDROID" ], "_age" : [ 23 ] } >
$first
> db.persion.aggregate([{$group: {_id: "$favorite", first_name: {$first: "$name"}}}]) { "_id" : [ "JAVA", "NODE", "MONGO", "GO" ], "first_name" : "tom" } { "_id" : [ "PHP", "MONGO", "GO" ], "first_name" : "jack" } { "_id" : [ "PYTHON", "RUBY", "MYSQL", "GO", "ANDROID" ], "first_name" : "bill" } >
$last
> db.persion.aggregate([{$group: {_id: "$favorite", first_name: {$last: "$name"}}}]) { "_id" : [ "JAVA", "NODE", "MONGO", "GO" ], "first_name" : "tom" } { "_id" : [ "PHP", "MONGO", "GO" ], "first_name" : "jam" } { "_id" : [ "PYTHON", "RUBY", "MYSQL", "GO", "ANDROID" ], "first_name" : "bill" } >管道
聚合管道:將當命令前輸出的結果作為下一個命令的參數 管道操作可以重復
表達式:處理輸入文檔并輸出。表達式是無狀態的,只能用于計算當前聚合管道的文檔,不能處理其它的文檔。
常用操作:
$project 修改輸入文檔的結構。可以用來重命名、增加或刪除域,也可以用于創建計算結果以及嵌套文檔
$match 用于過濾數據,只輸出符合條件的文檔。$match使用MongoDB的標準查詢操作
$limit 用來限制MongoDB聚合管道返回的文檔數
$skip 在聚合管道中跳過指定數量的文檔,并返回余下的文檔
$unwind 將文檔中的某一個數組類型字段拆分成多條,每條包含數組中的一個值
$group 將集合中的文檔分組,可用于統計結果
$sort 將輸入文檔排序后輸出
$project
值查找顯示name和age屬性
> db.persion.aggregate({$project: {name: 1, age: 1}}) { "_id" : ObjectId("5a6dbb6a3a8a0d47b8ee6d7d"), "name" : "tom", "age" : 22 } { "_id" : ObjectId("5a6dbb6a3a8a0d47b8ee6d7e"), "name" : "jack", "age" : 26 } { "_id" : ObjectId("5a6dbb6a3a8a0d47b8ee6d7f"), "name" : "bill", "age" : 23 } { "_id" : ObjectId("5a6dbb6a3a8a0d47b8ee6d80"), "name" : "james", "age" : 23 } { "_id" : ObjectId("5a6dc2db3a8a0d47b8ee6d81"), "name" : "jam", "age" : 26 }
$match
先匹配age大于22的數據 然后用這些數據統計favorite相同的人中出現的年齡數
> db.persion.aggregate([{$match: {age: {$gt: 22}}}, {$group: {_id: "$favorite", _age: {$push: "$age"}}}]) { "_id" : [ "PHP", "MONGO", "GO" ], "_age" : [ 26, 23, 26 ] } { "_id" : [ "PYTHON", "RUBY", "MYSQL", "GO", "ANDROID" ], "_age" : [ 23 ] } >
$skip
跨過前兩條數據
> db.persion.aggregate({$skip: 2}) { "_id" : ObjectId("5a6dbb6a3a8a0d47b8ee6d7f"), "name" : "bill", "age" : 23, "favorite" : [ "PYTHON", "RUBY", "MYSQL", "GO", "ANDROID" ] } { "_id" : ObjectId("5a6dbb6a3a8a0d47b8ee6d80"), "name" : "james", "age" : 23, "favorite" : [ "PHP", "MONGO", "GO" ] } { "_id" : ObjectId("5a6dc2db3a8a0d47b8ee6d81"), "name" : "jam", "age" : 26, "favorite" : [ "PHP", "MONGO", "GO" ], "_age" : [ 23 ] } >
$unwind
將favorite拆開
> db.persion.aggregate([{$unwind: "$favorite"}]) { "_id" : ObjectId("5a6dbb6a3a8a0d47b8ee6d7d"), "name" : "tom", "age" : 22, "favorite" : "JAVA" } { "_id" : ObjectId("5a6dbb6a3a8a0d47b8ee6d7d"), "name" : "tom", "age" : 22, "favorite" : "NODE" } { "_id" : ObjectId("5a6dbb6a3a8a0d47b8ee6d7d"), "name" : "tom", "age" : 22, "favorite" : "MONGO" } { "_id" : ObjectId("5a6dbb6a3a8a0d47b8ee6d7d"), "name" : "tom", "age" : 22, "favorite" : "GO" } { "_id" : ObjectId("5a6dbb6a3a8a0d47b8ee6d7e"), "name" : "jack", "age" : 26, "favorite" : "PHP" } { "_id" : ObjectId("5a6dbb6a3a8a0d47b8ee6d7e"), "name" : "jack", "age" : 26, "favorite" : "MONGO" } { "_id" : ObjectId("5a6dbb6a3a8a0d47b8ee6d7e"), "name" : "jack", "age" : 26, "favorite" : "GO" } { "_id" : ObjectId("5a6dbb6a3a8a0d47b8ee6d7f"), "name" : "bill", "age" : 23, "favorite" : "PYTHON" } { "_id" : ObjectId("5a6dbb6a3a8a0d47b8ee6d7f"), "name" : "bill", "age" : 23, "favorite" : "RUBY" } { "_id" : ObjectId("5a6dbb6a3a8a0d47b8ee6d7f"), "name" : "bill", "age" : 23, "favorite" : "MYSQL" } { "_id" : ObjectId("5a6dbb6a3a8a0d47b8ee6d7f"), "name" : "bill", "age" : 23, "favorite" : "GO" } { "_id" : ObjectId("5a6dbb6a3a8a0d47b8ee6d7f"), "name" : "bill", "age" : 23, "favorite" : "ANDROID" } { "_id" : ObjectId("5a6dbb6a3a8a0d47b8ee6d80"), "name" : "james", "age" : 23, "favorite" : "PHP" } { "_id" : ObjectId("5a6dbb6a3a8a0d47b8ee6d80"), "name" : "james", "age" : 23, "favorite" : "MONGO" } { "_id" : ObjectId("5a6dbb6a3a8a0d47b8ee6d80"), "name" : "james", "age" : 23, "favorite" : "GO" } { "_id" : ObjectId("5a6dc2db3a8a0d47b8ee6d81"), "name" : "jam", "age" : 26, "favorite" : "PHP", "_age" : [ 23 ] } { "_id" : ObjectId("5a6dc2db3a8a0d47b8ee6d81"), "name" : "jam", "age" : 26, "favorite" : "MONGO", "_age" : [ 23 ] } { "_id" : ObjectId("5a6dc2db3a8a0d47b8ee6d81"), "name" : "jam", "age" : 26, "favorite" : "GO", "_age" : [ 23 ] } >
$group
略...
$sort
按照年齡排序 1正序-1倒序
> db.persion.aggregate([{$sort: {age: 1}}]) { "_id" : ObjectId("5a6dbb6a3a8a0d47b8ee6d7d"), "name" : "tom", "age" : 22, "favorite" : [ "JAVA", "NODE", "MONGO", "GO" ] } { "_id" : ObjectId("5a6dbb6a3a8a0d47b8ee6d7f"), "name" : "bill", "age" : 23, "favorite" : [ "PYTHON", "RUBY", "MYSQL", "GO", "ANDROID" ] } { "_id" : ObjectId("5a6dbb6a3a8a0d47b8ee6d80"), "name" : "james", "age" : 23, "favorite" : [ "PHP", "MONGO", "GO" ] } { "_id" : ObjectId("5a6dbb6a3a8a0d47b8ee6d7e"), "name" : "jack", "age" : 26, "favorite" : [ "PHP", "MONGO", "GO" ] } { "_id" : ObjectId("5a6dc2db3a8a0d47b8ee6d81"), "name" : "jam", "age" : 26, "favorite" : [ "PHP", "MONGO", "GO" ], "_age" : [ 23 ] } >
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/19191.html
摘要:概述使用這個教程在和使用軟件包安裝社區版雖然發行版包含自己的軟件包官方的社區版包通常是最新的平臺支持本安裝教程僅支持位操作系統詳細信息請參閱平臺支持軟件包在自己的存儲庫中提供官方支持軟件包此存儲庫包含以下軟件包軟件名簡介一個元軟件包將自動 概述 使用這個教程在 SUSE Linux 11 和 12 使用 .rpm 軟件包安裝 MongoDB 社區版. 雖然 SUSE 發行版包含自己的 ...
摘要:概述使用本教程在系統上安裝社區版平臺支持自版本開始不支持請使用更新版本的來使用更新版本的重要如果你正在運行任何版本的或者請安裝修復程序以解決上的內存映射文件的問題要求社區版需要或者更高版本安裝程序包含所有其它軟件依賴項將自動更新使用文件安裝 概述 使用本教程在 Windows 系統上安裝 MongoDB 社區版. 平臺支持: 自2.2版本開始, MongoDB 不支持 Windo...
摘要:概述使用這個教程在使用軟件包安裝社區版本安裝教程僅支持位操作系統詳細信息請參閱平臺支持軟件包在自己的存儲庫中提供官方支持軟件包此存儲庫包含以下軟件包軟件名簡介一個元軟件包將自動安裝下面列出的四個組件包包含守護程序和關聯配置和初始化腳本 概述 使用這個教程在 Amazon Linux 使用 .rpm 軟件包安裝 MongoDB 社區版. 本安裝教程僅支持64位操作系統. 詳細信息請參閱平...
摘要:概述使用這個教程在或者使用軟件包安裝社區版雖然包含自己的軟件包但官方的社區版包通常是最新的本安裝教程僅支持位操作系統詳細信息請參閱平臺支持這些軟件包可以與其它版本一起工作。 概述 使用這個教程在 Debian 7 Wheezy 或者 Debian 8 Jessie 使用 .deb 軟件包安裝 MongoDB 社區版. 雖然 Debian 包含自己的 MongoDB 軟件包, 但官方的 ...
摘要:概述使用這個教程在使用軟件包安裝社區版包含自己的軟件包但官方的社區版包通常是最新的平臺支持本安裝教程僅提供位長期支持版本例如,等等這些軟件包可能將和其它版本一起工作然后它們并不支持軟件包在自己的存儲庫中提供官方支持軟件包此存儲庫包含以下軟件 概述 使用這個教程在 LTS Ubuntu Linux 使用 .deb 軟件包安裝 MongoDB 社區版. Ubuntu 包含自己的 Mong...
摘要:概述使用這個教程在企業版或者使用軟件包安裝社區版雖然一些發行版包含自己的軟件包官方的社區版包通常是最新的平臺支持本安裝教程僅支持位操作系統詳細信息請參閱平臺支持不建議對企業版的支持軟件包在自己的存儲庫中提供官方支持軟件包此存儲庫包含以下軟件 概述 使用這個教程在 Red Hat 企業版 Linux 或者 CentOS6/7 Linux 使用 .rpm 軟件包安裝 MongoDB 社區版...
閱讀 2454·2021-10-08 10:17
閱讀 1830·2021-09-06 15:02
閱讀 2545·2019-08-29 17:30
閱讀 2669·2019-08-29 13:24
閱讀 1529·2019-08-29 11:12
閱讀 3342·2019-08-28 17:52
閱讀 672·2019-08-26 11:30
閱讀 3581·2019-08-26 11:01