如果添加子文档,React Native Meteor 订阅会中断

React Native Meteor subscription breaks if subdocument added

概览(简体)

我是 运行 一个 Meteor 服务器,其发布由 ID 参数化:

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() 它是空的,除非子文档字段为空。

在 meteor 服务器的 Web 客户端上,如果我通过 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 不喜欢子文档 format/schema...

[更新 3]

我实验性地从子文档数组中删除了 "id" 字段,现在一切正常。所以在子文档数组中有一个 Meteor.Collection.ObjectID 类型的字段是一个问题...

经过多次试验,我发现 react-native-meteor 行为异常是因为我填充子文档的 _id 字段的方式。

本来我是设置ID为:

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

但是当我意识到这是导致问题的原因后,我改用了字符串版本:

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

现在本机客户端正常运行。我不确定这是否算作一种解决方法,或者我是否首先做错了什么......我的模式中的字段的类型设置为 type: Meteor.Collection.ObjectID 但它似乎对两个字符串都很满意和对象。