Rethinkdb создать, если не существует

Я пытаюсь сделать следующее:

  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.branch и r.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)
}

Но я не уверен, что замена является правильным методом для этого, а также не знаю, как проверить, существует ли данная строка.


person Balázs Édes    schedule 28.12.2016    source источник


Ответы (1)


Догадаться:

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)
  })
}
person Balázs Édes    schedule 28.12.2016