Rethinkdb 如果不存在则创建
Rethinkdb create if not exists
我想做的是:
- 检查是否存在具有过滤条件的记录
- 如果是,什么也不做
- 如果没有,请使用一些默认设置创建它。
现在我可以通过 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)
}
但我不确定替换是否是正确的方法,也不知道如何检查给定行是否存在。
想通了:
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)
})
}
我想做的是:
- 检查是否存在具有过滤条件的记录
- 如果是,什么也不做
- 如果没有,请使用一些默认设置创建它。
现在我可以通过 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)
}
但我不确定替换是否是正确的方法,也不知道如何检查给定行是否存在。
想通了:
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)
})
}