RethinkDB:条件追加启动(仅当特定字段匹配时)
RethinkDB: conditional upsert (only if particular fields are matched)?
我知道rethinkDB的insert()有一个upstart选项。例如,来自文档:
rethinkdb.table('marvel').insert(
{ superhero: 'Iron Man', superpower: 'Arc Reactor' },
{upsert: true, return_vals: true}
).run(conn, callback)
但是,假设可能存在具有不正确或过期超能力的{superhero: 'Iron Man'}
的现有记录,并且我想插入{ superhero: 'Iron Man', superpower: 'Arc Reactor' }
或更新任何现有的{superhero: 'Iron Man'}
记录?
简而言之:我如何才能追加销售,以便只有在特定字段匹配的情况下才能更新现有记录?
编辑:看起来这是用.replacement():完成的
以下是replace()文档中的重要部分:
如果在密钥上进行点替换,则可以插入新文档表中没有
我不确定"点替换"是什么意思,但我认为它只是替换的意思。
var latestDoc = { superhero: 'Iron Man', superpower: 'Arc Reactor' }
var mergeOrCreate = function(existingDoc) {
if ( existingDoc ) {
return existingDoc.merge(latestDoc)
} else {
return latestDoc
}
}
rethinkdb.table('marvel')
.filter({ superhero: 'Iron Man'})
.replace(mergeOrCreate),
).run(conn, callback)
然而,在测试中,"mergeOrCreate"函数被赋予了另一个函数,而不是一个实际的文档或游标作为参数。
您的第一个代码块就是第一个问题的答案。但是,它假定superhero
是表的主键。
您可以在创建表时设置表的主键:
r.tableCreate('marvel', {primaryKey: 'superhero'}).run(conn, cb)
您的第二个代码块有两个错误。
首先,mergeOrCreate函数不起作用,因为if
语句是在客户端求值的。您必须使用r.branch
来创建相当于if
语句的内容:
var mergeOrCreate = function(existingDoc) {
return r.branch(existingDoc, /* if */
existingDoc.merge(latestDoc), /* then */
latestDoc) /* else */
}
其次,get
不支持与filter
相同的语法。它的参数应该是主键的值。如果主键是superhero
,则:
r.table('marvel')
.get('Iron Man')
最后,如果superhero
不是主键,则必须编写不同类型的查询。可能有零个、一个或多个文档具有相同的superhero
。这里有一种写法:
r.table('marvel')
.insert(
r.table('marvel')
.filter({ superhero: 'Iron Man' })
.coerceTo('array')
.do(function(docs){
return r.branch(
docs,
docs.merge(latestDoc),
latestDoc)
}),
{ upsert: true })
.run(conn, cb);
请注意,由于此查询依赖于多个文档,因此它不是原子查询。
相关文章:
- 带有条件字段的PHP表单
- 如何在一定条件下使必填字段为真
- 将字段设置为有条件地使用所需的字段验证器
- AngularJs:在数字输入字段中设置验证的条件最小值和最大值
- Rails 4-具有依赖字段Rails的条件JS
- RethinkDB:条件追加启动(仅当特定字段匹配时)
- yii2:依赖于Action的条件显示/显示字段
- jquery validate-根据条件切换字段集(带有嵌套的必需字段)
- 当javascript中的强制字段隐藏在条件中时,如何限制它们的验证
- Angular2-对有条件创建的输入字段进行表单验证
- SmartyStreets:使用条件字段调整表单中已验证勾号的位置
- ExtJS有条件地呈现输入字段
- 具有条件字段的主干形式
- 有条件地在返回语句中包含 json 字段
- 必填字段的条件评估
- 一个字段上的语义 UI 表单验证规则是否可以以另一个字段为条件
- 检查是否所有输入字段都具有值 jQuery 条件
- 如果条件表达式,如何确定输入字段类型“submit”的当前 ID 以在 PHP 中使用
- 角度:条件字段不适用于服务器端
- D3表,对象沿x轴,字段沿y轴.如果满足字段条件,则将单元格着色