我很难在任何操作(插入/删除)之后获取最新的存储桶文档。我使用node.js + express + couchbase,这是我的代码,源自其官方网站。它基本上只是一个简单的地址簿web-app,有三个功能:插入,显示或删除联系人。
删除或插入操作后,我使用res.redirect("\")
重新加载我的页面。问题是:它只显示旧数据,只有在我第二次重新加载后才显示。我只是不知道这里有什么问题。有人可以帮忙吗?
/* GET home page. */
router.get('/', function(req, res) {
var query = ViewQuery.from('view_people', 'by_id');
bucket.query(query, function(err, results){
return res.render('index', {people: results});
});
});
/* INSERT Contact here */
router.post('/insert', function(req, res){
var name = req.body.name;
var address = req.body.address;
var job = req.body.job;
var age = req.body.age;
bucket.insert(name, {
name : name,
address : address,
job : job,
age : age
}, function(err, reply){
if(err) return res.send(err);
return res.redirect('/');
})
});
/* REMOVE the contact */
router.get('/remove', function(req, res){
var id = req.query.id;
bucket.remove(id, function(err, response){
if (err) {return res.send(err);}
return res.redirect('/');
})
});
module.exports = router;
答案 0 :(得分:0)
在Couchbase中,视图最终是一致的,看起来您正在使用视图,因此您看到了滞后。如果可以,您最好通过密钥获取文档,然后Couchbase非常一致。如果您的元数据对象是所有该用户的联系人的手动索引,那么您将获得最佳性能。然后,当您想要他们的联系人时,您拉动该元数据对象,然后通过密钥进行所需对象的并行批量获取。这应该非常好,并做同样的事情。最重要的是,您有一个唯一标识用户对象的密钥模式。
另一种选择是每个用户拥有一个计数器对象,它只是一个只有计数器的键值。所以例如有一个关键模式
用户名::接触::计数器
填写后,对象的键可能看起来像
hernandez94 ::接触:: 139
计数器将是该用户的联系人数组的上限。要获得最近的联系人,您只需获取计数器对象,获取该整数,构造密钥并获得该对象。它会非常快。要获取所有联系人,您将获得计数器对象,然后生成密钥以执行并行批量获取。再说一遍,这非常快。没有查询,只是原始速度可以持续扩展。
答案 1 :(得分:0)
看起来您需要在视图查询中使用stale = false。请参阅:https://forums.couchbase.com/t/how-does-stale-query-work/870