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 只需滿足( )內(nèi)的某一個值即可, 而$all 必須滿足[ ]內(nèi)的所有值,
例如: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 的數(shù)據(jù):
db.student.find({age:{$mod:[10, 1]}})1.5 $ne不等于
查詢x 的值不等于3 的數(shù)據(jù):
db.things.find( { x : { $ne : 3 } } );1.6 $in/$nin包含/不包含
與sql 標(biāo)準(zhǔn)語法的用途是一樣的,即要查詢的是一系列枚舉值的范圍內(nèi)查詢x 的值在2,4,6 范圍內(nèi)的數(shù)據(jù):
db.things.find({x:{$in: [2,4,6]}});1.7 $size數(shù)據(jù)元素個數(shù)
對于{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 的數(shù)據(jù),下面的查詢方法殊途同歸:
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查詢記錄條數(shù),limit限制返回記錄數(shù)
count 查詢記錄條數(shù):
db.users.find().count(); //全collection查詢注意:以下返回的是user 表中所有的記錄數(shù)量:
db.users.find().skip(10).limit(5).count();如果要返回限制之后的記錄數(shù)量,要使用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 游標(biāo)
MongoDB 也是用游標(biāo)來循環(huán)處理每一條結(jié)果數(shù)據(jù),典型用法如下:
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 同樣支持存儲過程。關(guān)于存儲過程你需要知道的第一件事就是它是用javascript 來寫的。MongoDB 存儲過程是存儲在db.system.js 表中的。
?
二、Capped Collection
1.簡介
capped collections 是性能出色的有著固定大小的集合,以LRU(Least Recently Used 最近最少使用)規(guī)則和插入順序進行age-out(老化移出)處理,自動維護集合中對象的插入順序,在創(chuàng)建時要預(yù)先指定大小。如果空間用完,新添加的對象將會取代集合中最舊的對象。
2.功能特別
可以插入及更新,但更新不能超出collection 的大小,否則更新失敗。不允許刪除,但是可以調(diào)用drop() 刪除集合中的所有行,但是drop 后需要顯式地重建集合。在32 位機上,一個capped collection 的最大值約為482.5M,64 位上只受系統(tǒng)文件大小的限制。
3. 常見用處
4.?推薦用法
5. 注意事項
?
三、GridFS
GridFS 是一種將大型文件存儲在MongoDB 數(shù)據(jù)庫中的文件規(guī)范。所有官方支持的驅(qū)動均實現(xiàn)了GridFS 規(guī)范。
1. 為什么使用GridFS?
由于MongoDB 中BSON 對象大小是有限制的,所以GridFS 規(guī)范提供了一種透明的機制,可以將一個大文件分割成為多個較小的文檔,這樣的機制允許我們有效的保存大文件對象,特別對于那些巨大的文件,比如視頻、高清圖片等。
2. 如何實現(xiàn)海量存儲?
為實現(xiàn)這點,該規(guī)范指定了一個將文件分塊的標(biāo)準(zhǔn)。每個文件都將在文件集合對象中保存一個元數(shù)據(jù)對象,一個或多個chunk 塊對象可被組合保存在一個chunk 塊集合中。大多數(shù)情況下,你無需了解此規(guī)范中細(xì)節(jié),而可將注意力放在各個語言版本的驅(qū)動中有關(guān)GridFS API 的部分或是如何使用mongofiles 工具上。
3. 簡單介紹
GridFS 使用兩個表來存儲數(shù)據(jù):
- files 包含元數(shù)據(jù)對象
- chunks 包含其他一些相關(guān)信息的二進制塊
為了使多個GridFS 命名為一個單一的數(shù)據(jù)庫,文件和塊都有一個前綴,默認(rèn)情況下,前綴是fs,所以任何默認(rèn)的GridFS 存儲將包括命名空間fs.files 和fs.chunks。各種第三方語言的驅(qū)動有權(quán)限改變這個前綴。
4.命令行工具
mongofiles [-options] [list|search|put|get]5. 索引
db.fs.chunks.ensureIndex({files_id:1, n:1}, {unique: true});這樣,一個塊就可以利用它的files_id 和 n 的值進行檢索。注意,GridFS 仍然可以用findOne得到第一個塊,如下:
?| 1 | db.fs.chunks.findOne({files_id: myFileID, n: 0}); |
?
四、MapReduce
MongoDB 的MapReduce 相當(dāng)于Mysql 中的"group by",所以在MongoDB 上使用 Map/Reduce進行并行"統(tǒng)計"很容易。
使用MapReduce 要實現(xiàn)兩個函數(shù) Map 函數(shù)和Reduce 函數(shù),Map 函數(shù)調(diào)用emit(key, value),遍歷collection中所有的記錄,將key與value傳遞給Reduce 函數(shù)進行處理。Map函數(shù)和Reduce函數(shù)可以使用JavaScript 來實現(xiàn),可以通過db.runCommand 或mapReduce 命令來執(zhí)行一個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 })
原文地址:http://www.cnblogs.com/oubo/archive/2012/02/22/2394665.html
轉(zhuǎn)載于:https://www.cnblogs.com/zqn518/p/3303856.html
總結(jié)
以上是生活随笔為你收集整理的MongoDB应用篇(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java对象的内存分配
- 下一篇: 由JS函数返回值引发的一场”血案