如果子文档添加

时间:2017-01-11 19:59:39

标签: mongodb reactjs meteor react-native ddp

概述(简体)

我正在运行一个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不喜欢关于subdoc格式/架构......

[更新3]

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

1 个答案:

答案 0 :(得分:0)

经过多次实验,我发现react-native-meteor由于我填充子文档的_id字段的方式而行为不端。

最初,我一直将ID设置为:

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

但是一旦我意识到这会导致问题,我就改用了字符串版本:

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

现在本机客户端正在表现。我不确定这是否算作一种解决方法,或者我是否在第一时间做错了...我的架构中的字段的类型设置为type: Meteor.Collection.ObjectID但它似乎对这两个字符串感到满意和对象。