Rethinkdb创建如果不存在

时间:2016-12-28 12:14:40

标签: javascript rethinkdb rethinkdb-javascript

我要做的是以下内容:

  1. 检查是否存在具有过滤条件的记录
  2. 如果有,请不要做任何事情
  3. 如果没有,请使用一些默认设置创建它。
  4. 现在我可以用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)
    }
    

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

1 个答案:

答案 0 :(得分:0)

想出来:

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)
  })
}