2016-12-07 4 views
1

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

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

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

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

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

+0

Я думаю, что нет ничего подобного " заменить на «для этого типа БД, возможно, вариант 1 или что-то вроде redis и cron, который делает ваш вариант 2 один раз в день. – vivoconunxino

+0

Я предпочитаю 1-е решение, но немного по-другому. Для каждой записи вам необходимо получить обратный вызов и сохранить последний раз, когда вы вставляете. При вставке новых данных вы должны проверить дату с датой переменной. Что касается этого сравнения, вы можете решить, что делать. –

ответ

3

Обновление существующих документов в 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/

+0

Ваш пример отлично подходит для таких данных, как кровяное давление или насыщение кислородом, где у вас есть «статическое» значение в заданное время. Проблема, с которой я сталкиваюсь, связана с «увеличивающимися» данными. например шагов в день или сжигаемых калорий в день. Предположим, что я запрашиваю данные, пригодные для ношения, два раза в день, тогда я получу одну запись DB с 3000 шагами, а другую - 6000 шагов. – Shrimbo

+0

У вас есть их во времени в представлении - просто выберите последний, если вас интересует только итог. Каждая запись будет представлять общую сумму во время захвата выборки. – xpqz

+0

Я согласен с @xpqz. Хранение данных дешево. Сохранение инкрементных данных также дает возможность делать графики с течением времени. – Raj

Смежные вопросы