我有一个nodejs应用程序,在其中使用nano
以下脚本连接到我的Sofadb :
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:我的设计文档是否为每个部署和服务器重新启动获取很多_revs是一个问题吗?即使文档本身没有变化?如果是这样,是否有一种方法可以仅在文档更改时更新它?(我想在我的应用程序中手动将_rev设置为某个值,但非常不确定那是个好主意)。
_rev
小号可以成为一个问题。_revs的历史记录保存为_revs_info
文档本身,并与文档一起存储(有关详细信息,请参阅CouchDB文档)。根据您的设置,创建不必要的修订可能是一个错误的决定。对于某些需要某些视图的服务器端脚本,我们也遇到了类似的挑战。我们的解决方案是计算新旧设计文档上的哈希值并进行比较。您可以为此作业使用任何哈希函数,例如sha1或md5。只需记住在对哈希进行哈希处理之前从旧文档中删除_rev,否则每次都会得到不同的哈希值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句