Orientdb 你如何做';如果不存在,则插入';使用orientjs?

Orientdb 你如何做';如果不存在,则插入';使用orientjs?,orientdb,orientjs,Orientdb,Orientjs,“如果不存在,则插入”的惯用方法是什么 这可以在没有事务的情况下完成吗?尝试以下方法: 如果记录不存在,则使用upsert创建记录,除非它更新 var OrientDB = require('orientjs'); var server = OrientDB({ host: 'localhost', port: 2424, username: 'root', password: 'root' }); var db = server.use({

“如果不存在,则插入”的惯用方法是什么

这可以在没有事务的情况下完成吗?

尝试以下方法:

如果记录不存在,则使用upsert创建记录,除非它更新

var OrientDB = require('orientjs');

 var server = OrientDB({

     host: 'localhost',
     port: 2424,
     username: 'root',
     password: 'root'

 });

 var db = server.use({

     name:  'GratefulDeadConcerts',
     username: 'root',
     password: 'root'

 })

 db.query('UPDATE V SET id = 23 UPSERT WHERE id = 23')
 .then(function (response) {
    console.log(response);
});

 server.close();
希望能有帮助


关于

例如,您可以使用此代码

db.query('select from v where rid = 23')
    .then(function (record) {
        if(record.length==0){
            db.query('insert into v(rid) values (23)');
        }
 });

希望有帮助。

如果数据非常小(可以保存在服务器内存中),则可以执行1个get调用来获取所有数据,并仅对尚未存在的数据执行批插入


如果您的创建数据非常大(超过了运行时内存),则必须遵循Alessandro的方法(这会很慢,因为每次插入都需要检查)。

谢谢您的回复。upsert与我所寻找的语义并不完全相同。更新将创建文档的新版本,即使所有数据都相同。我要寻找的是一种通过id检查记录是否存在的方法,如果不存在,则进行插入。如果记录确实存在,它应该是一个
noop
。我现在就是这样做的,但它不是一个真正的原子操作。我正在尝试将OrientDB用于大容量流式处理后端,但仍然存在一些边缘情况,即在流外接收到重复项,并且两个都尝试插入。这会导致索引出现重复键问题。