Rethinkdb заменить документ, если документ существует, иначе вставить документ

Я хотел бы вставить документ, если он не существует (client_nr не найден). Если это существует, замените весь документ новыми значениями. Другое дело, что client_nr не является первичным ключом. Первичный ключ — это идентификатор по умолчанию, созданный базой данных rethinkdb.

Я попробовал приведенный ниже код в узле js, но ничего не произошло. Данные находятся в переменной jsonArray. Я использую цикл for для просмотра всего jsonArray.

Любая идея, как решить эту проблему?

Спасибо!!!

for(var Ticker in jsonArray){
    r.db(db).table('trades').filter({client_nr: jsonArray[Ticker].client_nr}).forEach(function(post) {
    return r.branch(
    post.eq(null),
    r.db(db).table('log').insert(jsonArray[Ticker]),
    r.db(db).table('log').replace(jsonArray[Ticker])
     )
    }).run()
}

person Big Skinny    schedule 31.10.2015    source источник


Ответы (1)


Это намного проще сделать, если client_nr является вашим первичным ключом. Я бы подумал об этом вместо использования автоматически сгенерированных идентификаторов. Это также обеспечит уникальность на поле, что, вероятно, вам и нужно.

Меня также немного смутил ваш пример, потому что ваше описание звучало так, как будто вы хотели вставить/заменить в ту же таблицу, которую вы фильтруете, но ваш пример ссылается на две разные таблицы.

Предполагая, что вы хотите использовать одну таблицу, это должно сделать что-то вроде этого:

TABLE.filter({client_nr: jsonArray[Ticker].client_nr}).replace(function(row) {
  return r(jsonArray[Ticker]).merge(row.pluck('id'));
}).do(function(res) {
  return r.branch(
    res('replaced').add(res('unchanged')).eq(0),
    TABLE.insert(jsonArray[Ticker]),
    res);
})
person mlucy    schedule 01.11.2015
comment
Привет, спасибо за вашу помощь. Я пробовал предложенный код, но получаю следующую ошибку: return r.(jsonArray[Ticker]).merge(row.pluck('id')); ^ SyntaxError: Неожиданный токен ( - person Big Skinny; 01.11.2015
comment
Я пробовал другой код, но безуспешно. Ничего не вставлено и не заменено. /* r.db(db).table('trades').filter({client_nr: jsonArray[Ticker].client_nr}).do( function(row){ return r.branch(row.eq(null), r .table('trades').insert(jsonArray[Ticker]), r.table('trades').filter({client_nr: row}).replace(jsonArray[Ticker]) ) } ) /* printf(%d \n, 42); /* что еще за вопрос? */ - person Big Skinny; 02.11.2015
comment
Извините, я пытаюсь отредактировать комментарий, где вы видите код более четко, но у меня не получилось. r.db(db).table('trades').filter({client_nr: jsonArray[Ticker].client_nr}).do( function(row){ return r.branch(row.eq(null), r.table ('trades').insert(jsonArray[Ticker]), r.table('trades').filter({client_nr: row}).replace(jsonArray[Ticker]) ) } ) - person Big Skinny; 02.11.2015
comment
Синтаксическая ошибка, потому что вы написали r.(jsonArray[Ticker]) вместо r(jsonArray[Ticker])? Если r(jsonArray[Ticker]) не работает, попробуйте r.expr(jsonArray[Ticker]). - person mlucy; 03.11.2015