4

我已将 rethinkdb 更新到 1.11.2,并在更新/替换命令中发现向后不兼容。在 1.10 中,两个命令命令都返回正确的响应

r.db('test').table('user').get("notFound").update({a: 1}) // {"skipped": 1 ,...}
r.db('test').table('user').get("notFound2").replace({a: r.row('a').default(0).add(1)}) // {"inserted": 1 ,...}

但在 1.11.2 中失败并出现错误:

RqlRuntimeError: Expected type OBJECT but found NULL. in:
r.db("test").table("user").get("notFound").update({a: 1})

我想以原子方式更新一个简单的文档,使用单个查询(不检查它是否存在)。

有没有办法以 1.10 的方式在 rethinkdb >= 1.11 中执行查询?

4

2 回答 2

4

请注意,我尝试了这个:https ://github.com/rethinkdb/rethinkdb/issues/209 ,但它引发了关于期望对象但为空的运行时错误。这是我为日志记录表所做的:

r.do(r.db('test').table('log').get('3333'), function(x) {
  return r.branch(
    x.eq(null),
    r.db('test').table('log').insert({id: '3333', log: 'looool', c: 1}),
    r.db('test').table('log').get('3333').update(function(l) { return {c: l('c').add(1)}; })
  )
});

这有点冗长,但如果该行不存在,它会添加它,如果该行确实存在,它会增加它的计数器。

编辑:刚刚从 1.11.1 升级到 1.11.3 并且原始链接有效。我现在可以这样做:

r.db('test').table('log').get('3333').replace(function(x) {
  return r.branch(
    x.eq(null),
    {id: '3333', log: 'haiii', c: 1},
    x.merge({c: x('c').add(1)})
  )
})
于 2014-02-07T01:25:12.113 回答
0

如果您对正在创建的文档(如果不存在)感到满意(类似于replace),则可以使用 upsert。请参阅此处的 upsert 示例http://rethinkdb.com/api/javascript/insert/

更新:我首先认为 upsert 的行为就像update文档存在的情况一样。但实际上它的行为类似于replace,即删除现有文档的字段(如果它们不在您提供的字段中)insert

于 2014-01-09T23:22:05.443 回答