MongoDB应用篇
一、高級查詢
1. 查詢操作符
1.1 比較操作符$gt,$lt,$gte,$lte
實例: select * from things where field<value -- 等價于db.things.find({"field":{$lt:value}})select * from things where field<value2 and field>value1 -- 等價于db.things.find({"field":{$lt:value2,$gt:value1}})
1.2 $all匹配所有
這個操作符跟SQL 語法的in 類似,但不同的是, in 只需滿足( )內的某一個值即可, 而$all 必須滿足[ ]內的所有值,
例如:db.users.find({age:{$all:[6,8]}});可以查詢出{name:'David',age:26,age:[6,8,9]}但查詢不出{name:'David',age:26,age:[6,7,9]}1.3 $exists判斷字段是否存在
查詢所有存在age 字段的記錄:
db.users.find({age: {$exists: true}});查詢所有不存在name 字段的記錄:
db.users.find({name: {$exists: false}});1.4 $mod取模運算符
查詢age 取模10 等于1 的數據:
db.student.find({age:{$mod:[10, 1]}})1.5 $ne不等于
查詢x 的值不等于3 的數據:
db.things.find( { x : { $ne : 3 } } );1.6 $in/$nin包含/不包含
與sql 標準語法的用途是一樣的,即要查詢的是一系列枚舉值的范圍內查詢x 的值在2,4,6 范圍內的數據:
db.things.find({x:{$in: [2,4,6]}});1.7 $size數據元素個數
對于{name: 'David', age: 26, favorite_number: [ 6, 7, 9 ] }記錄匹配db.users.find({favorite_number: {$size: 3}});不匹配db.users.find({favorite_number: {$size: 2}});
1.8 正則表達式$not:/ * /
查詢不匹配name=B*帶頭的記錄:
select * from users where name not like 'B%'等價于db.users.find({name:{$not:/^B.*/}});1.9 null值處理
db.users.find({age:null})這種查詢會查出age為null的和沒有age字段的json對象。可采用下面方法達到查詢目的:
db.users.find({age:{"$in":[null], "$exists":true}})1.10 Javascript查詢和$where查詢
查詢a 大于3 的數據,下面的查詢方法殊途同歸:
db.c1.find( { a : { $gt: 3 } } );db.c1.find( { $where: "this.a > 3" } );
db.c1.find("this.a > 3");
f = function() { return this.a > 3; } db.c1.find(f);
1.11 count查詢記錄條數,limit限制返回記錄數
count 查詢記錄條數:
db.users.find().count(); //全collection查詢注意:以下返回的是user 表中所有的記錄數量:
db.users.find().skip(10).limit(5).count();如果要返回限制之后的記錄數量,要使用count(true)或者count(非0)
1.12 skip限制返回記錄的起點
從第3 條記錄開始,返回5 條記錄:(limit 3, 5)等價于:
db.users.find().skip(3).limit(5);1.13 sort 排序
以年齡升序ascdb.users.find().sort({age: 1});
以年齡降序descdb.users.find().sort({age: -1});
2 游標
MongoDB 也是用游標來循環處理每一條結果數據,典型用法如下:
for(var cursor=db.users.find();cursor.hasNext()){printjson(cursor.next())};db.users.find().forEach( function(u) { printjson(u); } );
db.users.find().forEach(printjson);
1.3 存儲過程
MongoDB 同樣支持存儲過程。關于存儲過程你需要知道的第一件事就是它是用javascript 來寫的。MongoDB 存儲過程是存儲在db.system.js 表中的。
?
二、Capped Collection
1.簡介
capped collections 是性能出色的有著固定大小的集合,以LRU(Least Recently Used 最近最少使用)規則和插入順序進行age-out(老化移出)處理,自動維護集合中對象的插入順序,在創建時要預先指定大小。如果空間用完,新添加的對象將會取代集合中最舊的對象。
2.功能特別
可以插入及更新,但更新不能超出collection 的大小,否則更新失敗。不允許刪除,但是可以調用drop() 刪除集合中的所有行,但是drop 后需要顯式地重建集合。在32 位機上,一個capped collection 的最大值約為482.5M,64 位上只受系統文件大小的限制。
3. 常見用處
4.?推薦用法
5. 注意事項
?
三、GridFS
GridFS 是一種將大型文件存儲在MongoDB 數據庫中的文件規范。所有官方支持的驅動均實現了GridFS 規范。
1. 為什么使用GridFS?
由于MongoDB 中BSON 對象大小是有限制的,所以GridFS 規范提供了一種透明的機制,可以將一個大文件分割成為多個較小的文檔,這樣的機制允許我們有效的保存大文件對象,特別對于那些巨大的文件,比如視頻、高清圖片等。
2. 如何實現海量存儲?
為實現這點,該規范指定了一個將文件分塊的標準。每個文件都將在文件集合對象中保存一個元數據對象,一個或多個chunk 塊對象可被組合保存在一個chunk 塊集合中。大多數情況下,你無需了解此規范中細節,而可將注意力放在各個語言版本的驅動中有關GridFS API 的部分或是如何使用mongofiles 工具上。
3. 簡單介紹
GridFS 使用兩個表來存儲數據:
- files 包含元數據對象
- chunks 包含其他一些相關信息的二進制塊
為了使多個GridFS 命名為一個單一的數據庫,文件和塊都有一個前綴,默認情況下,前綴是fs,所以任何默認的GridFS 存儲將包括命名空間fs.files 和fs.chunks。各種第三方語言的驅動有權限改變這個前綴。
4.命令行工具
mongofiles [-options] [list|search|put|get]5. 索引
db.fs.chunks.ensureIndex({files_id:1, n:1}, {unique: true});這樣,一個塊就可以利用它的files_id 和 n 的值進行檢索。注意,GridFS 仍然可以用findOne得到第一個塊,如下:
db.fs.chunks.findOne({files_id: myFileID, n: 0});四、MapReduce
MongoDB 的MapReduce 相當于Mysql 中的"group by",所以在MongoDB 上使用 Map/Reduce進行并行"統計"很容易。
使用MapReduce 要實現兩個函數 Map 函數和Reduce 函數,Map 函數調用emit(key, value),遍歷collection中所有的記錄,將key與value傳遞給Reduce 函數進行處理。Map函數和Reduce函數可以使用JavaScript 來實現,可以通過db.runCommand 或mapReduce 命令來執行一個MapReduce 的操作:
1 db.runCommand({2 mapreduce : ,
3 map : ,
4 reduce :
5 [, query : ]
6 [, sort : ]
7 [, limit : ]
8 [, out : ]
9 [, keeptemp: ]
10 [, finalize : ]
11 [, scope : ]
12 [, verbose: ]
13 })
?
?
轉載于:https://www.cnblogs.com/oubo/archive/2012/02/22/2394665.html
總結
以上是生活随笔為你收集整理的MongoDB应用篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】堆和栈的区别
- 下一篇: 关于MultipleOutputForm