CouchDB, похоже, реализует MapReduce иначе, чем Couchbase-lite.

На диване у меня есть следующее представление:

function(doc) {
  if(doc._id === 'countryMobileNumberCodes') {
    Object.keys(doc.dictionary).forEach(function(k, i) {
      emit(k, doc.dictionary[k]);
    });
  }
}

Это выдает следующий результат:

{"total_rows":2,"offset":0,"rows":[
{"id":"countryMobileNumberCodes","key":"1","value":"+265"},
{"id":"countryMobileNumberCodes","key":"2","value":"+27"}
]}

Это же представление на Android (используя Couchbase-lite-Android 1.2.1) не выводит никаких строк. Однако, если бы я изменил представление на это:

function(doc) {
  if(doc._id === 'countryMobileNumberCodes') {
    emit(doc._id, doc.dictionary);
  }
}

Затем я получаю результаты с веб-сайта Couchbase-lite (так что документы определенно существуют на мобильном устройстве).

Реализует ли CouchDB MapReduce иначе, чем Couchbase-lite?

Я видел ссылку на тот факт, что Couchbase-lite и CouchDB совместимы на 100%, но это не так (Couchbase-lite и CouchDB).


person Zach Smith    schedule 24.05.2016    source источник
comment
Они совместимы в том смысле, что могут синхронизироваться друг с другом, но в остальном это два продукта, разработанные двумя организациями. Они используют разные движки Javascript и т. д.   -  person borrrden    schedule 25.05.2016


Ответы (1)


Предположительно, вы используете REST API Couchbase Lite, возможно, в рамках PhoneGap или Cordova. Похоже, что интерпретатор JavaScript в этом контейнере не поддерживает Object.keys или foreach(). Возможно, вам придется переписать карту и сократить количество функций, используя только старые функции JavaScript.

(Мой JS очень ржавый, поэтому я не могу сказать вам, какая версия языка добавила эти API. Также возможно, что они не встроены, а являются частью библиотеки, которую CouchDB включает в свой контекст JS для удобства.)

person Jens Alfke    schedule 06.06.2016
comment
Спасибо за ответ. Цикл for (var key в obj) также не работал - person Zach Smith; 07.06.2016
comment
Что ж, все, что я могу сказать, это то, что реализация map/reduce такая же, как в CouchDB, поэтому все, с чем вы сталкиваетесь, связано с программированием JS, что предотвращает вызов функции emit. Вам нужно будет найти способ отлаживать содержимое функции карты, чтобы вы могли видеть, что она делает неправильно. Может быть, скопировать код в другое место вашего приложения, где его будет легче отлаживать? - person Jens Alfke; 08.06.2016
comment
Couchbase-lite работает на Android. Есть результат из представления, массивы строк пусты. Возможно ли, что emit не вызывается? - person Zach Smith; 08.06.2016
comment
Если в результате запроса нет строк и вы не ограничиваете запрос параметром startkey/endkey/keys, тогда emit не вызывается, да. Каждый вызов emit добавляет строку в индекс представления. - person Jens Alfke; 09.06.2016
comment
Спасибо. Я никогда не думал, что отсутствие результатов в массиве строк означает, что функция emit() никогда не вызывается. Кажется очевидным задним числом. Однако я до сих пор не вижу причины, по которой for (var k in doc.obj) {if doc.obj.hasOwnProperty(k) {...}} не работает. код работает на CouchDB. И документы определенно существуют в Couchbase-lite. - person Zach Smith; 10.06.2016
comment
На самом деле я перебираю подобъект объекта документа. Повлияет ли это на Couchbase-lite? - person Zach Smith; 10.06.2016
comment
Скорее всего, ваша функция карты в какой-то момент выдает исключение, которое прерывает ее. Например, довольно распространенной ошибкой является попытка использовать несуществующее значение свойства. Можете ли вы проверить журналы приложения или вывод консоли, чтобы узнать, печатаются ли сообщения об ошибках? Я не очень хорошо знаком с реализацией Android CBL, но надеюсь, что когда это произойдет, она выдаст сообщение об ошибке. Вы также можете попробовать вызвать log("...") из функции карты; это должно записать сообщение журнала. Затем вы можете выполнить отладку типа printf. - person Jens Alfke; 11.06.2016