Graph 我如何将AQL用于使用彼此结果的多个查询?

Graph 我如何将AQL用于使用彼此结果的多个查询?,graph,atomic,arangodb,aql,arangojs,Graph,Atomic,Arangodb,Aql,Arangojs,我有两个顶点和一条边,分别命名为用户、设备和所有权 我的业务逻辑是,当我接收到设备信息时,我会使用添加的dateCreated和DateUpdate字段将其插入。如果我插入了该设备,那么我将插入具有默认值的新用户,并创建到该设备的边缘连接。如果我更新,我将返回已连接的用户。 在不失去原子性的情况下,我如何实现这一点 我尝试了单个AQL查询,但没有条件,这似乎是不可能的,插入/更新操作也不支持遍历 我可以进行单独的查询,但这会失去原子性 var finalQuery = aql` UPSERT

我有两个顶点和一条边,分别命名为用户、设备和所有权

我的业务逻辑是,当我接收到设备信息时,我会使用添加的dateCreated和DateUpdate字段将其插入。如果我插入了该设备,那么我将插入具有默认值的新用户,并创建到该设备的边缘连接。如果我更新,我将返回已连接的用户。

在不失去原子性的情况下,我如何实现这一点

我尝试了单个AQL查询,但没有条件,这似乎是不可能的,插入/更新操作也不支持遍历

我可以进行单独的查询,但这会失去原子性

var finalQuery = aql`
UPSERT ${deviceQuery} 
INSERT MERGE(${deviceQuery},{dateCreated:DATE_NOW()}) 
UPDATE MERGE(${deviceQuery},{dateUpdated:DATE_NOW()}) 
IN ${this.DeviceModel}
RETURN { doc: NEW, type: OLD ? 'update' : 'insert' }`;

var cursor = await db.query(finalQuery);
var result = await cursor.next();
if (result.type == 'insert') {
  console.log('Inserted documents')

  finalQuery = aql`
  LET user=(INSERT {
    "_key":UUID(),
      "name": "User"
    } INTO user
    RETURN NEW)
    
    INSERT {
    _from:${result.doc._id},
    _to:user[0]._id,
      "type": "belongs"
    }INTO ownership
    
    return user[0]`;

    cursor = await db.query(finalQuery);
    result = await cursor.next();
    console.log('New user:',result);
    
}

你可以试试这样的

Upsert ....

FILTER !OLD
Let model = NEW

LET user= First(INSERT {
    "_key":UUID(),
      "name": "User"
    } INTO user
    RETURN NEW)
    
    INSERT {
    _from:model._id,
    _to:user._id,
      "type": "belongs"
    }INTO ownership
    
    return user

最后,我将修改查询和选择查询分开

var finalQuery = aql`
LET device=(
UPSERT ${deviceQuery} 
INSERT MERGE(${deviceQuery},{dateCreated:DATE_NOW()}) 
UPDATE MERGE(${deviceQuery},{dateUpdated:DATE_NOW()}) 
IN ${this.DeviceModel}
RETURN { doc: NEW, type: OLD ? 'update' : 'insert' })
FILTER device[0].type=='insert'
LET user=(INSERT {
"_key":UUID(),
"name": "User"
} INTO user
RETURN NEW)

INSERT {
_from:device[0].doc._id,
_to:user[0]._id,
"type": "belongs"
}INTO ownership
return user[0]`;

var cursor = await db.query(finalQuery);
var result = await cursor.next();
if (result == null) {
  const deviceId=this.DeviceModel.name+"/"+queryParams._key;
  finalQuery = aql`
  FOR v,e,p IN 1..1 
  OUTBOUND ${deviceId} ownership 
  FILTER e.type=="belongs" 
  RETURN v `;

  cursor = await db.query(finalQuery);
  result = await cursor.next();
  isUpdate=true;
}

这样我就保证了原子性。有一些改进用于控制if
cursor.extra.stats.writeExecuted
true等,但如果发生更新,则不会返回用户。对于这两种情况(更新和插入),我都需要一个用户。我怀疑这能否实现。数据修改后,您将继续运行到
访问中
错误