如何在交易中获取插入的文档ID? (arangoDB)

时间:2018-07-09 23:27:12

标签: php transactions arangodb

我一直在网上寻找线索,但似乎找不到任何线索。

public function createNew($name, $type, $restriction,$picture){
   global $connection;
   $trans=new Transaction($connection,array( 'collections' => array( 'write' => array( 'group_relations','groups' ),'read'=> array( 'group_relations','groups' ) ), 'waitForSync' => true ));
   $trans->setAction('function(){
      var db= require("@arangodb").db;
      var arr=db.groups.insert({"name":"'.$name.'","type":"'.$type.'","restriction":"'.$restriction.'","picture":"'.$picture.'"}).toArray();
                db.group_relations.insert({"_from":"users/'.$_SESSION['uid'].'","_to":"groups/"+arr[0]["_id"],"status":"admin"});
      }');
   $trans->execute();
}

这是一个进行交易的PHP函数。在交易中,我试图创建一个组,获取其ID并将其插入创建者和新组之间的关系集合中。

基本上将组的创建者设为管理员。

  

致命错误:未捕获的triagens \ ArangoDb \ ServerException:17 db.groups.insert(...)。toArray不是函数”。

有解决方案吗?

1 个答案:

答案 0 :(得分:0)

insert({...})的结果始终是一个对象。 insert([{...},{...},...,{...}])的结果始终是一个数组。无论哪种情况,.toArray()都无济于事。

因此,如果您要确保将数组作为结果类型,请也将数组insert用于单个条目:

var arr=db.groups.insert(
  [{"name":"'.$name.'",
    "type":"'.$type.'",
    "restriction":"'.$restriction.'",
    "picture":"'.$picture.'"}]);

因此,为了仅从插入内容中获取ID:

var ids = []; 
db.groups.insert([{...},...,{...}]).forEach(
  function(obj) {ids.push(obj._id)});
...