如何在查找当时可能不存在的特定文档时,防止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;
}
答案 0 :(得分: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
}
}