Mongodb 如果添加子文档,则响应本机Meteor订阅中断
概述(简化) 我正在运行Meteor服务器,其发布由ID参数化:Mongodb 如果添加子文档,则响应本机Meteor订阅中断,mongodb,reactjs,meteor,react-native,ddp,Mongodb,Reactjs,Meteor,React Native,Ddp,概述(简化) 我正在运行Meteor服务器,其发布由ID参数化: Meteor.publish('documents.byId', function(documentId) { ... return Documents.find({documentId}); }); 文档集合(名称已更改)附带了一个simplescma。 此文档的架构包含一个字段,该字段是子文档的数组 Documents.schema = new SimpleSchema({ ... subdocuments:
Meteor.publish('documents.byId', function(documentId) {
...
return Documents.find({documentId});
});
文档
集合(名称已更改)附带了一个simplescma。
此文档的架构包含一个字段,该字段是子文档的数组
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本机版本: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
的字段是一个问题…经过多次实验,我发现react native Meteor
由于我填充子文档的\u id
字段的方式不当
最初,我将ID设置为:
var _id = new Meteor.Collection.ObjectID();
但当我意识到这会导致问题时,我使用了字符串版本:
var _id = new Meteor.Collection.ObjectID().valueOf();
现在本机客户端正在运行。我不确定这是否算是一个解决办法,或者我一开始是否做错了什么。。。我的模式中的字段的类型设置为
type:Meteor.Collection.ObjectID
,但它似乎对字符串和对象都很满意 反应本机版本?当然!抱歉,它是0.39.2,我的Meteor版本是1.4.2.3您的listview无法呈现子文档?为了好玩,您是否尝试过在主方案的子文档字段中注释默认值?作为一个测试。谢谢@zim,这是一个合理的建议,因此我已经尝试过了,但最终还是解决了这个问题(见我发布的答案)。无论如何,谢谢你抽出时间!