прослушивание изменений pouchdb в конкретном представлении возвращает все документы

Пытаюсь получить изменения в pouchDB для определенного представления, но все еще получаю allDocs... что я делаю не так? Не нашел каких-либо руководств или подробной информации о том, как это сделать, кроме документации по API пакета (http://pouchdb.com/api.html#changes). Я пробовал параметры просмотра и фильтра, но безуспешно.

Это представление создано и сохранено как /notes.

function(doc) {
  if (doc.model == 'note') {
    emit(doc._id, doc);
  }
}

Лента живых изменений:

pouch.changes({ 
  live: true,
  view: '_view/notes'
})
.on('change', function handleUpdate(change) {

  // log changed document
  pouch.get(change.id).then(function(row) {
    console.log(row);
  }

})

Может быть, путь просмотра неверен...? Спасибо за любую помощь.


person Mikuláš Sychra    schedule 21.01.2015    source источник


Ответы (2)


Гораздо проще, вы можете сделать:

pouch.changes({ 
  live: true,
  include_docs: true
}).on('change', function (change) {
  if (change.doc && change.doc.model === 'note') {
    console.log(change);
  }
});

Поверьте мне; использование представлений в фильтре changes() просто добавляет ненужную сложность и не будет работать быстрее. Извините, что не разъяснил это в документации. :)

person nlawson    schedule 21.01.2015
comment
Использование представления, когда вы хотите получить полное содержимое базы данных, бесполезно, я согласен. Но что, если вы хотите выполнить репликацию из подмножества вашей базы данных. Использование представления в allDocs(),changes() и replicate() должно подойти, не так ли? - person PhE; 28.01.2015
comment
Это должно работать, но я не использовал его много, поэтому я не могу гарантировать отсутствие ошибок. Кроме того, вы не получаете никаких преимуществ в производительности/сложности кода при использовании {view: 'myview'}. Однако я зарегистрирую ошибку. - person nlawson; 28.01.2015
comment
@nlawson Были бы некоторые преимущества в использовании {view: 'myview', filter: '_view'}, если бы вы использовали адаптер HTTP, верно? (Возможно, это не самый распространенный вариант использования PouchDB.) FWIW, @MikulášSychra, я заметил, что опция filter: '_view' требуется, если вы хотите использовать представление для фильтрации ленты изменений, если вы используете HTTP-адаптер, как я. :-Д - person David Alan Hjelle; 17.02.2015
comment
Да, в адаптере HTTP он позволяет избежать отправки большого количества данных по сети. В PouchDB нет никакой выгоды, потому что хранилище последовательности уже проиндексировано для быстрого поиска change(). Я немного говорю об этом в этом видео - person nlawson; 17.02.2015

ПО умолчанию changes() возвращает все изменения с начала базы данных. Таким образом, вы получите ВСЕ изменения документов, что эквивалентно вызову allDocs().

Чтобы получить изменения с определенного момента времени, вы должны указать параметр опции с.

Из документа API PouchDB:

options.since: Start the results from the change immediately after the
given sequence number, you can also pass 'now' if you want only
new changes.

Вы можете получить порядковый номер при вызове db.info() или при извлечении документа через db.get(docId) с параметром local_seq. сильный>.

person PhE    schedule 28.01.2015
comment
Если вы делаете живые изменения, вы также можете сделать {since: "now"}, который просто начнет прослушивать изменения после заданного момента времени. - person nlawson; 17.02.2015