我在那裏我使用nano
與下面的腳本連接到我的CouchDB的一個的NodeJS應用:CouchDB的更新設計文檔
const { connectionString } = require('../config');
const nano = require('nano')(connectionString);
// creates database or fails silent if exists
nano.db.create('foo');
module.exports = {
foo: nano.db.use('foo')
}
這個腳本是在每個服務器開始運行,所以它試圖創建數據庫「富'每次服務器(重新啓動),只是在數據庫已經存在的情況下靜靜地失敗。
我非常喜歡這個想法,因爲這樣我實際上在應用程序級維護數據庫,並且在我決定添加新數據庫時不需要手動創建數據庫。
採取這種方法更進一步我也試圖從應用程序級別維護我的設計文檔。
...
nano.db.create('foo');
const foo = nano.db.use('foo');
const design = {
_id: "_design/foo",
views: {
by_name: {
map: function(doc) {
emit(doc.name, null);
}
}
}
}
foo.insert(design, (err) => {
if(err)
console.log('design insert failed');
})
module.exports = {
foo
}
顯然這隻會插入設計文檔,如果它不存在。但是如果我更新了我的設計文檔並想更新它,該怎麼辦?
我想:
foo.get("_design/foo", (err, doc) => {
if(err)
return foo.insert(design);
design._rev = doc._rev
foo.insert(design);
})
現在的問題是,設計文檔每次更新服務器重新啓動(例如它得到一個新的_rev每次重啓時)。
現在...我的問題(S):)
1:這是提供引導我的CouchDB與數據庫和設計一個不錯的辦法?作爲我的部署過程的一部分,我應該考慮一些遷移步驟嗎?
2:這是一個問題,我的設計文檔得到許多 _revs,基本上爲每個部署和服務器重新啓動?即使文件本身沒有改變?如果是這樣,是否有辦法只更新文件,如果它改變了? (我想在我的應用程序中手動設置_rev值,但很不確定這是一個好主意)。
謝謝Bernhard。你的解釋真的很有幫助。我只是通過比較設計文檔來接受你的建議,但遇到了一些麻煩,將它們與md5進行比較......我根據你的建議在下面發佈了我自己的解決方案。你可否提供你的意見? –