如何访问插入的文档';ArangoDB中事务中的s_id

如何访问插入的文档';ArangoDB中事务中的s_id,arangodb,Arangodb,我没有看到在事务中访问插入/更新文档密钥的任何示例 var collections = {write: ['foo','bar']}; var action = String(function () { var doc = params['doc']; var relatedDoc = params['relatedDoc']; var db = require('internal').db; db.foo.save(doc); // how do I acces

我没有看到在事务中访问插入/更新文档密钥的任何示例

var collections = {write: ['foo','bar']};
var action = String(function () {
    var doc = params['doc'];
    var relatedDoc = params['relatedDoc'];
    var db = require('internal').db;
    db.foo.save(doc); // how do I access the _id, key etc of the newly inserted doc?
    relatedDoc.foos.push(doc._id); // _id does not exist yet
    db.bar.save(relatedDoc);
    return {success: true};
});
var params = {
    doc: doc,
    relatedDoc: relatedDoc
};
db.transaction(collections, action, params, function (err, result) {
    if (err) {
        return dfd.reject(err);
    }
    return dfd.resolve(result);
});
collection.save()
方法将为保存的文档返回一些元数据:

  • \u rev
    :文档修订id(由服务器自动生成)
  • \u-key
    :文档密钥(由用户在
    \u-key
    属性中指定,如果不是,则由服务器自动生成)
  • \u id
    :与键相同,但也包括集合名称
要在代码中使用生成的id,可以在变量中捕获
collection.save()
的结果,并按如下方式使用它:

var collections = {write: ['foo','bar']};
var action = String(function () {
    var doc = params['doc'];
    var relatedDoc = params['relatedDoc'];
    var db = require('internal').db;
    var newDoc = db.foo.save(doc);     // capture result of save in newDoc
    relatedDoc.foos.push(newDoc._id);  // use newDoc._id for 
    db.bar.save(relatedDoc);
    return {success: true};
});
var params = {
    doc: doc,
    relatedDoc: relatedDoc
};
db.transaction(collections, action, params, function (err, result) {  
  if (err) {
      return dfd.reject(err);
    }
    return dfd.resolve(result);
});

+1表示
字符串(函数(){…})
以避免多行字符串。与ES6文本字符串相比,我不确定效率。我认为一个常规的
var action=function(){…}也会起作用。至少这是我一直在使用的,尽管你必须小心,不能将它们用作闭包。