我想在一个查询中应用文档替换,但我想保留旧文档中的特定属性(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"}
是否有人建议执行此操作?
提前致谢
答案 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);