2016 年 7 月

第 31 卷,第 7 期

本文章是由機器翻譯。

工作的程式師如何成為平均: 大家一起來 DEAN

Ted Neward | 2016 年 7 月

Ted Neward歡迎回來,同樣地,MEANers。或者,若為本月"DEAN"函式,而是。

使交談和周圍 MEAN 堆疊架構,令人讚嘆的其中一個是平均堆疊在本質上是彈性 — 您可以取代其他且更-或-低-對等項目組件的堆疊的元件,並建立新的堆疊,可以滿足企業/不含白白架構本質。這個概念的示範,在本專欄中我要試驗 MongoDB 取代 Microsoft Azure DocumentDB (因此,"M"取代"D")。

MongoDB vs。DocumentDB

對於使用者尚未花時間熟悉 DocumentDB,我強烈建議您先在現有的資源使用,包括 Julie Lerman 的 2015 年 6 月的資料點的資料行 (msdn.com/magazine/mt147238)。Lerman 提供的 DocumentDB,其最有趣的功能,其中包括伺服器端程式碼執行 (沒錯,如以 JavaScript 撰寫的預存程序所示)。如果您從未了 glanced 在 DocumentDB 中,或是需要快速入門時,請執行先快速閱讀。

在介面中,MongoDB 和 DocumentDB 是類似的生物。這兩個文件導向的資料庫,做為主要文件表示的格式使用 JSON 它們。每個擴充以納入一些其他資料類型的 JSON。它們每個考慮集合的文件,根據資料,並使用,做為主要的彙總配置 (而非資料表)。它們在本質上 「 非關聯式 」,因為資料庫不會將文件連結到其他文件所使用的文件任何的識別碼驗證。就此而言,它們也都 「 無結構描述,「 文件的內容都是完全在開發人員手中,相同的文件結構並不在集合中的所有項目來執行。

因此,這應該是簡單的交換。

不過,除了在位元,您會發現一些更深入的差異,就能立即一個主要差異在於︰ 雖然可以下載並關閉膝上型電腦在本機執行 MongoDB,DocumentDB 才可使用透過 Azure 訂閱,因此 DEAN 的首要步驟是建立 Azure 帳戶上的 DocumentDB 執行個體的簡單的工作。說明數個其他位置中詳細資料 (包括線上的 DocumentDB 文件中),因此我將不會重複此程序這裡除了要彙總。請移至 Azure 管理入口網站、 建立新的 Azure DocumentDb 資源、 為它指定唯一的名稱 (我稱為地雷 dean db) 和打孔大藍色的 [建立] 按鈕。在入口網站將會流失幾分鐘,Azure 會在雲端中建立您的 DocumentDB 執行個體。

您不再使用入口網站之前,有幾項你需要稍後在程式碼中的資訊。讓我們花點時間,現在記下它們。特別是,您將需要連接、 URL,以確保它是您的授權金鑰。在 Azure 管理入口網站中,這稱為主索引鍵 (沒有第二個呼叫的次要索引鍵),並撰寫本文時,它會顯示在 [所有設定] 索引標籤的 [金鑰] 下。這些索引鍵是共用的密碼,因此千萬不要洩漏方法論 — 特別是,如果程式碼會進入公用原始程式碼存放庫 (la GitHub),請確定索引不是簽入的原始碼的一部分。(依照慣例,Node.js 應用程式設定為環境變數,並挑選此金鑰做為其啟動的一部分來使用應用程式進入點程式碼; 您曾做過如下所示在先前的反覆項目,此程式碼基底,因此這不應該可以預料得到)。 如果金鑰被盜以任何方式 (做為在探索時,索引鍵以某種方式提取出至公開),請務必重新產生金鑰並將其取代。事實上,它可能是個不錯的主意,只是在原則週期每隔 30 個或 60 天。

這表示,在現有的程式碼基底 config.js 現在看起來會如 [圖 1

[圖 1 中現有的程式碼基底的 Config.js

module.exports = {
  mongoServer : "localhost",
  mongoPort : "27017",
  docdbServer : "https://dean-db.documents.azure.com:443/",
  docdbKey :
    "gzk030R7xC9629Cm1OAUirYg8n2sqLF3O0xtrVl8JT
      ANNM1zV1KLl4VEShJyB70jEtdmwnUUc4nRYyHhxsjQjQ=="
      };
if (process.env["ENV"] === "prod") {
  module.exports.mongoServer = "ds054308.mongolab.com";
  module.exports.mongoPort = "54308";
  module.exports.docdbServer = process.env["DOCDB_HOST"];
  module.exports.docdbKey = process.env["DOCDB_KEY"];
}

 (順便一提,我已經已循環索引鍵上我的儲存機制,因此顯示的索引鍵是的讓您了解它會看起來像。)

嗨,從 Node.js

下一個步驟是可預測,您需要 Node.js 模組存取的 DocumentDB 執行個體,且您使用做到這點 」 npm 安裝-documentdb 儲存 」。 當然,您需要 「 需要 」 它 app.js 程式碼,就像這樣︰

var express = require('express'),
  bodyParser = require('body-parser'),
  debug = require('debug')('app'),
  edge = require('edge'),
  documentdb = require('documentdb'),
  ...;
// Go get our configuration settings
var config = require('./config.js');
debug("Mongo is available at ",config.mongoServer,":",config.mongoPort);
debug("DocDB is available at ",config.docdbServer);

從這裡開啟連接是簡單的建構 DocumentClient 物件使用的伺服器與授權金鑰,就像這樣︰

// Connect to DocumentDB
var docDB = documentdb.DocumentClient(config.docdbServer, {
  masterKey: config.docdbKey
});

現在,當然,更大的問題是︰ 該怎麼辦,一旦您已開啟?

使用 DocumentDB

像 MongoDB,DocumentDB 會使用 JSON 格式的結構描述和集合的文件,因此儲存 (例如 「 簡報 」) 的資料那里牽涉到相同類型的作業,如您所見的 MongoDB 在過去。不過,此 API 很有點不同,可能由於某些 Microsoft 如何喜歡設計項目之間如何事情的發展出開放原始碼世界的文化特性差異。

(此外,我發現到目前為止的最佳 DocumentDB/Node.js 參考是 Azure 文件頁面的 [範例組 [bit.ly/1TkqXaP]。它是直接連結至 GitHub,以及 DocumentDB Node.js API 原始碼中產生文件的連結儲存 Microsoft 所設計的範例專案的集合,就不需任何項目更正式的是,我一直在使用它做為我移至參考 DocumentDB api)。

簡單來說,資料庫用戶端物件建構之後,您需要連接到資料庫使用 databaseId;這是實際的資料庫,幾乎與 MongoDB 伺服器可以裝載多個資料庫的方式相同。不過,不同於 MongoDB,使用 DocumentDB 這個資料庫必須建立事先。這可透過程式設計方式 (這是絕佳的展示和 DevOps 案例),透過 createDatabase API 呼叫中,或透過 Azure 管理入口網站 (這可能會較常見的方法,這通常一次性作業) 使用 [新增資料庫] 索引標籤下 DocumentDB 資源網頁。為了簡單起見,這裡的程式碼會假設 conferencedb 的資料庫已經存在,大概是稍早建立入口網站中。假設有資料庫存在,Node.js 可以連接到它藉由呼叫 queryDatabases,接著就到下一個最大的差別在方法中 MongoDB 和 DocumentDB 中所示 [圖 2

[圖 2 的資料庫清單的查詢 DocumentDB

docClient.queryDatabases({
  query: 'SELECT * FROM root r WHERE r.id = @id',
  parameters: [
    {
      name: '@id',
      value: 'conferencedb'
    }
  ]}).toArray(function (err, results) {
  if (err) {
    handleError(err);
  }
  if (results.length === 0) {
    // No error occured, but there were no results returned
    // indicating no database exists matching the query           
    // so, explictly return null
    debug("No results found");
  } else {
    // Found a database, so return it
    debug('Found a database:', results[0]);
    var docDB = results[0];
  }
});

首先,請注意,DocumentDB API 使用明確查詢規格,「 甚至要擷取的資料庫,完整的參數清單。這是從 Mongo 的 「 範例查詢 」 方法已標示的差異。授與,您顯然不需要使用此選項 — 能就這麼內嵌母體擴展,透過字串串連的引數的 — 但將 testify 任何開發人員都曾經 SQL 資料隱碼攻擊的受害者,執行如下的參數化的查詢是多了更安全。

另一個主要差異是,當然,查詢語言 — hello,SQL,我那位老朋友。若要老實說,但並不完全 SQL,因為您沒有資料表、 資料行等功能,但是 Microsoft 已經大費周章地適應透過熟悉的查詢語言的文件導向的世界。不論這是 「 錯誤 」 或 「 特性 」 可能會相依於開發人員的愛或仇恨關聯性的關聯式資料庫的世界裡,但這些 (以及其他) 決策,Microsoft 會清楚地將 DocumentDB 標示為 SQL Server 和 MongoDB 入侵選擇 (或其他文件資料庫),不是不正確之處。

一旦找到資料庫,您需要取得集合中,一次識別項。像是資料庫、 集合都是 「 正式 」 項目,這表示它們需要被明確地建立使用 createCollection API 呼叫或透過 Azure 管理入口網站。提供如何 DocumentDB 認定的為資料表的集合,這不是令人意外。同樣地,最簡單的做法是由 (撰寫本文時) 建立一個透過入口網站中,按一下資料庫以並排顯示 DocumentDB 資源] 磚中的資料庫名稱。這樣會開啟新索引標籤,可以加入新的集合,簡報,並接著尋找它透過該識別項,像是在 [圖 3

[圖 3 找到資料庫嗎? 現在,找出集合

// We found a database
debug('Found a database:', results[0]);
docDB = results[0];
debug('Looking for collections:');
docClient.readCollections('dbs/conferencedb').
toArray(function(err, colls) {
if (err) {
  debug(err);
}
else {
  if (colls.length === 0) {
    debug("No collections found");
  }
  else {
    for (var c in colls) {
      debug("Found collection",colls[c]);
      if (colls[c].id === 'presentations')
        presentationColl = colls[c];
      }
    }
  }
});

記下的第一個參數 readCollections API 的呼叫。如果看起來就指定某種類型的問題的資料庫類似的 URI/URL 路徑,它應該。每次呼叫 Node.js DocumentDB API 可讓您輕鬆使用這些類型的 REST-ish 識別項直接查看集合 (以及最終會文件) 所需而不需要巡覽複雜的階層。

(從 MongoDB 非常不同的一個重要事項︰ 費用為每個集合為基礎,其服務,其中 MongoDB 使用者會考慮集合單純的模型化的觀點而言,有了 DocumentDB,判斷来建立新的集合將會有一個直接影響您得到支付每月支付費用。)

最後,若要尋找任何特定的文件,該集合中,您會使用 queryDocuments API。同樣地,您傳入集合識別項 (這因為您知道的集合你之後,您只要內嵌程式碼中直接),並取得結果,以便將其傳遞直接傳回做為 JSON 主體中,就像我一樣幾個資料行的 MongoDB 中所示 [圖 4

[圖 4 列出集合中的所有文件

var getAllPresentations = function(req, res) {
  debug("Getting all presentations from DocumentDB:");
  docClient.queryDocuments("dbs/conferencedb/colls/presentations",
  {
    query: "SELECT * FROM presentations p"
  }).toArray(function (err, results) {
    if (err) res.status(500).jsonp(err);
    else res.status(200).jsonp(results);
  });
};
// ...
app.get('/presentations', getAllPresentations);

當然,如果您想要限制的演講者簡報,,會路由組態的一部分是查詢參數和會變成 「 查詢 」 規格中的參數等等。

總結

當我開始這篇文章時,我引用 MongoDB 和 DocumentDB 的相似處; 的所有方法不過,現在您可以啟動感測如果沒有其他的實際數目的兩個,透過其建構,背後的原理之間的差異。Microsoft 顯然想要一些 「 企業 」 文件導向資料庫世界,有了 DocumentDB,並提供其客戶基底,屬於穩固的移動。不過,顯然缺少的一件事 (目前) 是任何一種 DocumentDB API,類似於 Mongoose Node.js MongoDB api 提供的 「 object-ish 「 包裝函式。這不是複雜的事,開發人員建置其本身,但它確實代表開發人員必須撰寫和維護一段時間所說的更多程式碼。至少是開放原始碼社群直到其中一個連接埠 1,會調整以使用 MongoDB 或 DocumentDB (不太可能),或直到有人建置類似,但在程式碼更具特製化的方式比哪些 DocumentDB 接近生命。

更重要的是,不過,是了解縮略字 「 平均數 」 是指 — 縮略字。DocumentDB 代表只有一個可能的後端的持續性工具的十個各種類型的 「 * EAN"-ish 堆疊,包括良好驚訝的 SQL Server。其中"表示 「 不符合您公司的標準作業人員或業務目標隨意違規片段取代的項目更容易使用。結尾的後一天,架構字母 (逐字) 可為您身為開發人員和/或整個組織建立問題其實很荒謬。 我用完空間現在...祝各位寫程式 !


Ted Neward 是西雅圖 polytechnology 顧問、 講師及指導。 他已寫入 100 個以上的文章,是 F # MVP 和具有作者及合著者著作。與他連絡 ted@tedneward.com 如果您想要讓他來自與您的小組,或是閱讀他的部落格 blogs.tedneward.com

感謝以下技術專家對本文的審閱: Shawn Wildermuth