嵌套数组:如何追加新的数据点?

时间:2018-07-16 11:57:34

标签: python rethinkdb

抱歉,标题令人困惑,但不确定如何简短地解释这一点。

我有一个在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中追加到数组?

谢谢!

1 个答案:

答案 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))
          )
        });
      })
    );
}})