4

在查找当时可能不存在的特定文档时,如何防止 ArangoDB 在事务期间引发异常?

Nodejs 将事务以一个块的形式发送到 ArangoDb 并在那里进行处理。那很完美。我想将所有数学卸载到服务器。

在交易期间,我想查看特定的集合并检查是否存在文档,如果可以找到文档,则获取字段“余额”,但如果找不到文档或其字段,那么我不想抛出异常并且不想停止正在进行的事务。相反,我更想继续进行交易,我们将变量 oldBalance 分配给字符串'0'。

(供您参考:在 nodeJS 端指定了集合的写锁:'user'),在这里您可以看到发送到 ArangoDB 的部分事务代码:

var db = require('internal').db;
// 1.) find specific document
var accountdoc = db.user.document('Johnny04'); // find doc by _key

如果找不到具有该特定 _key 的文档,则会引发异常。那时用户可能在集合中没有条目。在这种情况下,我们想假设他的余额是字符串'0'。但不幸的是,已经抛出了异常。我更想像下面这样进行:

//2.) calculate newBalance = oldBalance + additional
        if (accountdoc.error==true){ // document not found etc...
            var oldBalance='0';
            var documentExists = false;
        } else {
            var oldBalance=accountdoc.balance;
            var documentExists = true;
            var documentExistsID = accountdoc._id;
        }   
4

1 回答 1

4

您不能像这样处理事务中的“找不到文档”错误吗:

function (params) {
  var db = require("org/arangodb").db;
  var accountdoc;

  // 1.) find specific document
  try {
    accountdoc = db.user.document('Johnny04'); // find doc by _key
  }
  catch (err) {
    // document not found etc.
    // TODO: rethrow exception if err is something different than "document not found"
  }

  // 2.) calculate newBalance = oldBalance + additional
  if (accountdoc === undefined) { // document not found etc...
    // create a new document with balance 0
    db.user.save({ _key: 'Johnny04', balance: '0' }); // note: if this fails, the transaction will throw
  } 
  else {
    // update the existing document
    var oldBalance = accountdoc.balance;
    var newBalance = oldBalance + 42;
    db.user.update('Johnny04', { balance: newBalance }); // note: if this fails, the transaction will throw
  }   
}
于 2014-05-29T13:19:57.223 回答