Подписка React Native Meteor прерывается при добавлении поддокумента

Обзор (упрощенный)

Я запускаю сервер Meteor с публикацией, параметризованной по идентификатору:

Meteor.publish('documents.byId', function(documentId) {
  ...
  return Documents.find({documentId});
});

К коллекции Documents (имя изменено) прикреплена SimpleScema. Схема этого документа содержит поле, представляющее собой массив вложенных документов.

Documents.schema = new SimpleSchema({
  ...
  subdocuments: {
    label: 'Sub Documents',
    type: [SubDocumentSchema],
    defaultValue: [],
    optional: true
  }
  ...
});

Documents.attachSchema(Documents.schema);

Затем у меня есть контейнер на стороне клиента обычным образом с подпиской:

...
var handle = Meteor.subscribe('documents.byId', documentId);
... 
var document = Meteor.collection('documents').findOne();
...    

Описание проблемы

На клиенте react-native-meteor данные подписки правильно принимаются клиентом только если в массиве нет вложенных документов. Как только добавляется вложенный документ, когда я пытаюсь повторно подписаться на react-native, список становится пустым. Интересно, что если я уже подписался, он все еще замечает изменения в документе, но как только я перезагружаю приложение, он больше не может его найти.

На сервере я проверил, что документы найдены путем регистрации, но на клиенте, когда я делаю Meteor.collections('documents).findOne(), он пуст, если только поле поддокумента не пусто.

На веб-клиенте для метеор-сервера, если я подписываюсь на документ по ID, все нормально, сколько бы ни было вложенных документов.

Вопрос

Я подозреваю, что это либо какая-то простая ошибка в стиле опечатки, либо проблема с самим react-native-meteor. Может ли кто-нибудь еще воссоздать это? Я застрял на этом некоторое время - мое единственное предположение состоит в том, что, возможно, нативная версия каким-то образом не устраивает схему?

[Изменить] Версии

Версия React-Native: 0.39.2

Метеор версия: 1.4.2.3

[Обновлять]

Пока я искал и просматривал код react-meteor-native, чтобы увидеть, что он делает, я обнаружил, что однажды данные действительно вернулись! Так что это, вероятно, какая-то проблема времени?

[Обновление 2]

Если я отфильтрую массив вложенных документов на стороне сервера, собственный клиент снова начнет работать:

return Documents.find({documentId}, {
  fields: {'subdocuments': 0}
}

Возможно, react-native-meteor что-то не нравится в формате/схеме поддокумента...

[Обновление 3]

Я экспериментально удалил поле "id" из массива вложенных документов, и теперь все работает нормально. Так что это проблема с наличием поля типа Meteor.Collection.ObjectID в массиве вложенных документов...


person k212    schedule 11.01.2017    source источник
comment
реактивная версия?   -  person Codesingh    schedule 11.01.2017
comment
Конечно! Извините, это 0.39.2, а моя версия Meteor 1.4.2.3.   -  person k212    schedule 11.01.2017
comment
ваш список не может отобразить вложенный документ?   -  person Codesingh    schedule 11.01.2017
comment
Подписка возвращает документ только при отсутствии вложенных документов. Если я добавлю вложенный документ, коллекция на стороне клиента станет пустой.   -  person k212    schedule 11.01.2017
comment
подписываться только на такие документы: var handle = Meteor.subscribe('documents', documentId);   -  person Codesingh    schedule 11.01.2017
comment
Если компонент, вызвавший подписку, размонтирован, подписка автоматически отменяется.   -  person Codesingh    schedule 11.01.2017
comment
Моя публикация на самом деле называется «documents.byId» (как вы увидите, если прочитаете мой вопрос), и код, который у меня есть, уже работает на веб-клиенте, а также работает на клиенте, ориентированном на реакцию, если массив вложенных документов пуст. Я не уверен, на чем основано ваше предложение? Нет такой подписки под названием «документы», и поэтому (как и ожидалось) я получаю сообщение об ошибке, если использую ваш код. Попробуйте еще раз внимательно прочитать мой вопрос.   -  person k212    schedule 11.01.2017
comment
Опять же, ничего общего с несмонтированными или смонтированными компонентами. Я могу войти из метода контейнера, я вижу, что состояние дескриптора не готово, а затем оно становится готовым. В случае, когда массив вложенных документов пуст, то в коллекции есть документ, в случае, когда массив вложенных документов не пуст, коллекция становится пустой.   -  person k212    schedule 11.01.2017
comment
пожалуйста, поделитесь кодом   -  person Codesingh    schedule 11.01.2017
comment
ты на андроиде работаешь?   -  person Codesingh    schedule 11.01.2017
comment
Давайте продолжим обсуждение в чате.   -  person k212    schedule 11.01.2017
comment
Ради интереса, пробовали ли вы закомментировать значение по умолчанию в поле поддокументов в основной схеме? Просто в качестве теста.   -  person zim    schedule 12.01.2017
comment
Спасибо @zim, это разумное предложение, и поэтому я уже пробовал его, но в конце концов я все равно решил это (см. ответ, который я опубликовал). В любом случае спасибо за ваше время!   -  person k212    schedule 12.01.2017


Ответы (1)


После долгих экспериментов я понял, что react-native-meteor ведет себя неправильно из-за того, как я заполнил поле _id для поддокумента.

Первоначально я устанавливал идентификатор на:

var _id = new Meteor.Collection.ObjectID();

Но как только я понял, что это вызывает проблемы, я вместо этого использовал строковую версию:

var _id = new Meteor.Collection.ObjectID().valueOf();

А теперь ведет себя родной клиент. Я не уверен, считается ли это обходным путем или я изначально делал что-то не так... для поля в моей схеме установлен тип type: Meteor.Collection.ObjectID, но, похоже, он доволен как строкой, так и объектом.

person k212    schedule 11.01.2017