Как обновлять записи базы данных вместо создания новых записей

В настоящее время я работаю над веб-приложением, в котором мы используем носимые устройства для мониторинга некоторых жизненно важных параметров. Для целей интеграционного тестирования я использую фитбит. Приложение написано на angular/javascript, база данных взята из cloudant. Мой вопрос: как вы обновляете записи базы данных в целом? Я хочу запрашивать данные с носимых устройств каждые два часа и обновлять уже существующую запись за этот день, а не создавать новую, чтобы предотвратить дублирование.

До сих пор я думал о двух вещах:

  1. хранить сегодняшние данные в переменной, особенно идентификатор записи базы данных, чтобы обновлять каждые несколько часов и очищать переменную в 0:00.
  2. перед каждым обновлением получите все записи и проверьте, есть ли запись на сегодняшнюю дату. Если это так, получите идентификатор указанной записи и обновите его, в противном случае создайте новый.

Я не очень доволен ни одним из решений.

заранее спасибо


person Shrimbo    schedule 07.12.2016    source источник
comment
Я думаю, что для такого рода БД нет ничего похожего на «заменить на», может быть, вариант 1 или что-то вроде Redis и cron, который выполняет ваш вариант 2 один раз в день.   -  person javier_domenech    schedule 07.12.2016
comment
Я предпочитаю 1-е решение, но немного по-другому. Для каждой записи вы должны получить обратный вызов и сохранить время последней вставки. При вставке новых данных вы должны проверять дату с помощью переменной date. В отношении этого сравнения вы можете решить, что делать.   -  person Akhter Al Amin    schedule 07.12.2016


Ответы (1)


Обновить существующие документы в Cloudant/CouchDB можно, но вы подвергаете себя конфликтам. Создание нового документа для каждого образца на самом деле является хорошим подходом для многих сценариев типа «IoT» с использованием Cloudant. Затем вы можете использовать представление для материализации данных. Ваши документы могут выглядеть так:

{
   "timestamp": "2016-12-01T13:25:02.000Z",
   "type": "pressure",
   "value": 110.0
}

Затем используйте проектный документ, который выдает данные, в соответствии с

function(doc) {
    if (doc && doc.timestamp && doc.value && doc.type) {
        var ts = Date.parse(doc.timestamp);
        emit([doc.type, ts], doc.value);
    }
}

Подробнее здесь: https://cloudant.com/blog/introduction-to-document-conflicts-part-three/

person xpqz    schedule 07.12.2016
comment
Ваш пример отлично работает для таких данных, как кровяное давление или насыщение кислородом, где у вас есть «статическое» значение в установленное время. Проблема, с которой я сталкиваюсь, связана с «приращением» данных. например шагов в день или сожженных калорий в день. Допустим, я запрашиваю данные о носимых устройствах два раза в день, тогда я получу одну запись БД с 3000 шагов, а другую — с 6000 шагов. - person Shrimbo; 07.12.2016
comment
У вас есть они в порядке времени в представлении - просто выберите последний, если вас интересует только общее количество. Каждая запись будет представлять общее количество на момент взятия пробы. - person xpqz; 07.12.2016
comment
Я согласен с @xpqz. Хранение данных дешевое. Хранение инкрементных данных также дает вам возможность строить графики с течением времени. - person Raj; 07.12.2016
comment
Я попробую. Спасибо за помощь. - person Shrimbo; 08.12.2016