【发布时间】:2014-03-24 13:37:16
【问题描述】:
我正在使用 Couchbase NoSQL DB,但我想这可能发生在任何 NoSQL DB 上。以下是发生的事情:
我正在检查是否存在特定密钥,并且我正在捕获 keyNotFound 错误,现在将此密钥添加到数据库中。见代码:
// retrieve the document for this connection_id
db.get(connection_id, function(err, result) {
if (err && err.code === 13) {
// Catched a keyNotFound -> define a new document for the voice connection
var voice_c = {
voice_count: '1',
voice_duration: call_duration,
last_contact: call_start
};
// Add this new Voice_c document for this connection_id to DB
db.add(connection_id, voice_c, function(err, result) {
if (err)
throw err; // whilst adding a new voice connection
});
当我进入 db.add 步骤时,我得到一个错误“密钥存在(具有不同的 CAS 值)”,即使我只是在之前检查了一毫秒的片段是否存在相同的密钥(并且它不存在) .
我无法在数据馈送中的同一位置复制错误,但第二次发生的时间更早,表明这是随机事件。我很困惑这怎么会发生,除非我的代码中有一个我看不到的大错误。
没有其他代码在运行和更改 NoSQL DB 中的文档,它们都在我的 MBP 上本地运行。在我开始运行我的脚本之前,数据库被刷新并且是空的。
我在数据馈送中手动检查过,当它第一次发生时,确实存在相同的 connection_id 大约 50 条记录。但是在第二种情况下,当第一次出现 connection_id 时抛出了错误(尽管后来出现了大约 19000 条记录)。很奇怪,希望有人能帮助我如何避免出现这个错误。
【问题讨论】:
-
您是否尝试过只使用
add而没有get?在这种情况下获取是没有用的,因为add不会将文档存储在数据库中。 -
@m03geek 我省略了找到密钥的部分的代码(大部分时间都在发生)以及我更新文档中的数字的部分。因此,尽管我同意您对上面代码 sn-p 的看法,但在这种情况下 GET 并不是无用的。