抱歉,标题令人困惑,但不确定如何简短地解释这一点。
我有一个在Array中包含Array的数据库,例如:
r.db('test').table('Example').insert({'id':'Object1',
'History':{'16-07-2018':{'Price':25,'Volume':200}}
})
我想要做的是添加一个新对象。如果该ID不存在,请创建它。如果已经存在,则将新日期添加到历史记录中(这是我的第一个问题,如何执行此操作?先使用insert再使用conflict=update
吗?),类似于:
Insert Object1 -> History -> 17-07-2018 -> {Price:40,Volume:150}
结果将是
{
"History": {
"16-07-2018": {
"Volume": 200,
"Price": 25
} ,
"17-07-2018": {
"Volume": 150,
"Price": 40
}
} ,
"id": "Object1"
}
总结:
1)如果不存在,如何告诉Rethink插入新行,如果存在则根据id对其进行更新?
2)如何在db中追加到数组?
谢谢!
答案 0 :(得分:0)
如前所述,由于您使用的是对象而不是数组,因此标题具有误导性。
对于对象,conflict: 'update'
选项执行所需的所有操作(创建/更新对象,更新/“附加”历史记录)。
对于(实际)数组,也可以使用conflict
选项,因为它可以将函数作为值:
r.db....insert({
id: 'Object1',
history: [{
date: '2018-01-01',
price: 40,
volume: 250
}]
}, {
conflict: function(id, oldDoc, newDoc) {
return r.branch(
newDoc('history').count().ne(1),
r.error("When updating, only one history item is allowed"),
r.do(function() {
var offsets = oldDoc('history').offsetsOf(function(item) {
return item('date').eq(newDoc('history').nth(0)('date'));
});
return oldDoc.merge({
history: r.branch(
offsets.isEmpty(),
oldDoc('history').append(newDoc('history').nth(0)),
oldDoc('history').changeAt(offsets.nth(0), newDoc('history').nth(0))
)
});
})
);
}})