2016-12-28 70 views
0

我試圖做的是以下幾點: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.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) 
} 

但我不知道,如果取而代之的是這個正確的方法,也沒有想法如何檢查,如果給定行存在。

回答

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