Rethinkdb 如果不存在则创建

Rethinkdb create if not exists

我想做的是:

  1. 检查是否存在具有过滤条件的记录
  2. 如果是,什么也不做
  3. 如果没有,请使用一些默认设置创建它。

现在我可以通过 2 个查询来完成:

function ensureDocumentExists(connection, criteria, defaults) {
  return r.table('tbl')
    .filter(criteria)
    .coerceTo('array') // please correct me if there's a better way
    .run(connection)
    .then(([record]) => {
      if (record) {
        return Promise.resolve() // Record exists, we are good
      } else {
        return r.table('tbl') // Record is not there we create it
          .insert(defaults)
          .run(connection)
      }
    })
}

r.branchr.replace 存在的事实表明,这在单个 运行 中是可能的。是吗?我在想这样的事情:

function ensureDocumentExists(connection, criteria, defaults) {
  return r.table('tbl')
    .filter(criteria)
    .replace(doc => r.branch(
      r.exists(doc), // If doc exists (I'm just making this up)
      doc, // Don't touch it
      defaults // Else create defaults
    )).run(connection)
}

但我不确定替换是否是正确的方法,也不知道如何检查给定行是否存在。

想通了:

function ensureDocumentExists(connection, criteria, defaults) {
  return r.table('tbl')
    .filter(criteria)
    .isEmpty() // isEmpty for the rescue
    .do(empty => r.branch(
      empty, // equivalent of if(empty)
      r.table('tbl').insert(defaults), // insert defaults
      null // else return whatever
    ).run(connection)
  })
}