日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
NoSQL內(nèi)戰(zhàn):MongoDB與CouchDB查詢方式對比

【經(jīng)典譯文】MongoDB和CouchDB都是面向文檔的數(shù)據(jù)庫,它們都使用JSON文檔格式,它倆通常都被看作是NoSQL數(shù)據(jù)庫,并且現(xiàn)在都很時(shí)髦,有很多的共同點(diǎn),但談到查詢時(shí),兩者的差別就很明顯了,CouchDB需要預(yù)定義視圖(本質(zhì)上是JavaScript MapReduce函數(shù)),而MongoDB支持動(dòng)態(tài)查詢(基本上和傳統(tǒng)關(guān)系數(shù)據(jù)庫上的即席查詢類似),更重要的是,談到查詢時(shí),CouchDB的API是RESTful,而MongoDB的API更原生化,這意味著在代碼中發(fā)出一個(gè)查詢就要使用一個(gè)驅(qū)動(dòng)。

例如,使用CouchDB時(shí),為了插入一些數(shù)據(jù),可以使用一些外部工具,如Groovy的RESTClient:

 
 
 
  1. import static groovyx.net.http.ContentType.JSON
  2. import groovyx.net.http.RESTClient
  3.  
  4. def client = new RESTClient("http://localhost:5498/")
  5. response = client.put(path: "parking_tickets/1234334325",
  6.   contentType: JSON,
  7.   requestContentType:  JSON,
  8.   body: [officer: "Robert Grey",
  9.          location: "199 Castle Dr",
  10.          vehicle_plate: "New York 77777",
  11.          offense: "Parked in no parking zone",
  12.          date: "2010/07/31"])

注意,在這種情況下,我必須為停車票指定一個(gè)編號(hào)(1234334325),順便提一下,也可以要求CouchDB使用UUID,如向/_uuids路徑發(fā)出一個(gè)HTTP GET請求。

編輯向您推薦:強(qiáng)勢的芒果:走進(jìn)MongoDB

例如,如果我想找出由Officer Grey開出的所有票,我必須定義一個(gè)視圖,視圖是執(zhí)行JavaScript MapReduce函數(shù)的簡單URL,因此我可以快速實(shí)現(xiàn)一個(gè)函數(shù)來提取officer屬性等于Robert Grey的所有文檔。

 
 
 
  1. function(doc) {
  2.   if(doc.officer == "Robert Grey"){
  3.     emit(null, doc);
  4.   }
  5. }

我必須給這個(gè)視圖取一個(gè)名字,當(dāng)我向這個(gè)視圖發(fā)出HTTP GET請求時(shí),至少可以得到一個(gè)文檔。

 
 
 
  1. response = client.get(path: "parking_tickets/_view/by_name/officer_grey",
  2.         contentType: JSON, requestContentType: JSON)
  3.  
  4. assert response.data.total_rows == 1
  5. response.data.rows.each{
  6.    assert it.value.officer == "Robert Grey"
  7. }

總的來說,使用CouchDB時(shí),我不能很快地發(fā)出一個(gè)即席RESTful調(diào)用查詢信息,必須先定義一個(gè)查詢(也叫視圖),然后將其暴露出來。相反,使用MongoDB時(shí),它和大多數(shù)關(guān)系數(shù)據(jù)庫沒多大區(qū)別,你可以在運(yùn)行時(shí)查詢你想要看到的任何信息。

例如,下面是我使用MongoDB的原生Java驅(qū)動(dòng)實(shí)現(xiàn)的停車票實(shí)例:

 
 
 
  1. DBCollection coll = db.getCollection("parking_tickets");
  2. BasicDBObject doc = new BasicDBObject();
  3.  
  4. doc.put("officer", "Robert Grey");
  5. doc.put("location", "199 Castle Dr");
  6. doc.put("vehicle_plate", "New York 77777");
  7. //...
  8. coll.insert(doc);

假設(shè)以后我要查詢Robert Smith發(fā)出的停車票,只需要簡單修改一下officer屬性值就可以了,如:

 
 
 
  1. BasicDBObject query = new BasicDBObject();
  2. query.put("officer", "Robert Smith");
  3. DBCursor cur = coll.find(query);
  4.  while (cur.hasNext()) {
  5.    System.out.println(cur.next());
  6.  }

雖然MongoDB和CouchDB有很多相似之處,但在查詢方面的確有著本質(zhì)的不同,CouchDB需要使用MapReduce,而MongoDB更多的是面向動(dòng)態(tài)的查詢,當(dāng)然MongoDB也是支持MapReduce的。

延伸閱讀

您如果想了解更多關(guān)于數(shù)據(jù)庫查詢方面的資料,向您推薦《構(gòu)建高效MySQL查詢》與《數(shù)據(jù)庫之索引與查詢專題》


新聞名稱:NoSQL內(nèi)戰(zhàn):MongoDB與CouchDB查詢方式對比
文章地址:http://www.dlmjj.cn/article/djhepoi.html