我有2个顶点和一个边,分别命名为用户、设备和所有权。
我的业务逻辑是,当我收到设备信息时,我会使用添加的dateCreated和dateUpdated字段来更新它。如果我插入了该设备,则会使用默认值插入新用户,并创建到该设备的边缘连接。如果我进行了更新,则会简单地返回已连接的用户作为结果。x1c 0d1x
在不失去原子性的情况下,我如何实现这一点?
我尝试了单个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);
}
2条答案
按热度按时间n7taea2i1#
你可以试试这样的
8fq7wneg2#
最后,我将修改查询和选择查询分开。
这样我就保证了原子性。在控制
cursor.extra.stats.writesExecuted
是否为真等方面也有改进。