av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

NoSQL內(nèi)戰(zhàn):MongoDB與CouchDB查詢方式對比

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

例如,使用CouchDB時,為了插入一些數(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"])

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

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

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

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

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

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

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

 
 
 
  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更多的是面向動態(tài)的查詢,當(dāng)然MongoDB也是支持MapReduce的。

延伸閱讀

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


網(wǎng)頁題目:NoSQL內(nèi)戰(zhàn):MongoDB與CouchDB查詢方式對比
網(wǎng)頁地址:http://uogjgqi.cn/article/djhepoi.html
掃二維碼與項目經(jīng)理溝通

我們在微信上24小時期待你的聲音

解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流