RethinkDB替换文档但不替换特定属性

时间:2017-10-12 22:12:36

标签: rethinkdb rethinkdb-javascript

我想在一个查询中应用文档替换,但我想保留旧文档中的特定属性(album_path=group_id + "/photos" )。

旧文件:

createdAt

新文件

{id: "xxx" title: "my title", description: "my desc", createdAt: "1507844981006"}

约束是:

  • 我想执行替换而不是更新以应用文档插入,以防文档不存在。

  • 要替换的字段(标题,说明)并不总是相同的

我的初始查询看起来像这样

{id: "xxx" title: "my title2", description: "my desc2", createdAt: "1507844981006"}

是否有人建议执行此操作?

提前致谢

1 个答案:

答案 0 :(得分:0)

  

我想执行替换而不是更新以应用文档插入,以防文档不存在。

你正在寻找的是" upsert" (或者#34; replsert"如果我们可以在RethinkDB中这样命名),据我所知,RethinkDB中没有这样的操作。 .replace()至少需要找到一个文档,因此无法插入。但是,它可以很容易地实现,也可以用ReQL香料调味。

以下示例可以直接在Data Explorer中测试:

const OLD_DOCUMENT = { id: 'xxx', title: 'my title', description: 'my desc', createdAt: '1507844981006' };
const NEW_DOCUMENT = { id: 'xxx', title: 'my title2', description: 'my desc2' };

r.db('TEST')
  .table('TEST')
  .delete();

// Comment out the following query to test the .insert() scenario,
// or uncomment it to test the .replace() scenario
r.db('TEST')
  .table('TEST')
  .insert(OLD_DOCUMENT);

r.db('TEST')
  .table('TEST')
  .replace((doc) => r.expr(NEW_DOCUMENT).merge(doc.pluck('createdAt')))
  .do(replaceData => r.branch(
    // Did the .replace() operation succeed with a real replacement?
    replaceData.getField('replaced').gt(0),
    // Then just return the replace result
    replaceData,
    // Otherwise, perform an insert
    r.db('TEST')
      .table('TEST')
      .insert(
        // Bonus (not just .insert(NEW_DOCUMENT))
        r.branch(
          // Does the document have the createdAt property set?
          r.expr(NEW_DOCUMENT).hasFields('createdAt'),
          // If yes, then no transformation is required
          NEW_DOCUMENT,
          // Else add the timestamp in your format
          r.expr(NEW_DOCUMENT).merge({ createdAt: r.now().toEpochTime().mul(1000).coerceTo('string') })
        )
      )
));

r.db('TEST')
  .table('TEST');

.insert()广告系列结果

{
  "createdAt": "1507890036302", // this property value will grow in time
  "description": "my desc2",
  "id": "xxx",
  "title": "my title2"
}

.replace()广告系列结果

{
  "createdAt": "1507844981006", // this value never changes in your test
  "description": "my desc2",
  "id": "xxx",
  "title": "my title2"
}

在风格和偏好方面,可以重复使用以下表达式:

  • const TABLE_EXPR = r.db('TEST').table('TEST');
  • const NEW_DOCUMENT_EXPR = r.expr(NEW_DOCUMENT);