nano
次のスクリプトを使用して、couchdb に接続する nodejs アプリケーションがあります。
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')
}
このスクリプトはサーバーが起動するたびに実行されるため、サーバーが (再) 起動するたびにデータベース '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 を取得します)。
今...私の質問:)
1: これは、CouchDB をデータベースと設計でブートストラップするための悪いアプローチですか? 展開プロセスの一部として、いくつかの移行手順を検討する必要がありますか?
2: 基本的にすべての展開とサーバーの再起動のたびに、設計ドキュメントが多くの_rev を取得することは問題ですか? ドキュメント自体は変わっていないのに?もしそうなら、ドキュメントが変更された場合にのみドキュメントを更新する方法はありますか? (アプリケーションで_revを手動で値に設定することを考えましたが、それが良いアイデアかどうかは非常にわかりません)。