使用 Meteor 发布关系包,其中每个联接不能使用 _id 字段
Using Meteor publish-with-relations package where each join cannot use the _id field
我正在努力解决一个与以下博客文章中的讨论没有什么不同的问题。这是希望在 Meteor 中发布两个相关的数据集,在服务器端有一个"反应式连接"。
https://www.discovermeteor.com/blog/reactive-joins-in-meteor/
然而,不幸的是,我希望加入的相关集合不会使用"_id"字段加入,而是使用另一个字段。通常在 mongo 和 meteor 中,我会创建一个"过滤器"块,我可以在其中指定此查询。但是,据我所知,在压水堆包中,有一个隐含的假设是加入"_id"。
如果您查看"发布与关系"github页面上给出的示例(见下文),您可以看到帖子和评论都已加入Meteor.users的"_id"字段。但是,如果我们需要加入 Meteor.users 的"地址"字段怎么办?
https://github.com/svasva/meteor-publish-with-relations
在短期内,我已经将我的查询指定为"颠倒"(因为幸运的是,我在进行反向连接时能够使用 _id 字段),但我怀疑随着数据集的增长,这将导致查询效率低下,因此宁愿能够在计划的方向上进行连接。
我们正在加入的两个集合可以被视为一个对话主题/标头记录和一个对话消息集合(即会话中每条消息的集合中的一个条目)。
我的解决方案中的对话主题是使用_id字段加入,对话消息有一个要加入的"conversationKey"字段。
以下调用有效,但这是从消息到对话的查询,反之亦然,这会更自然。
Meteor.publishWithRelations({
handle: this,
collection: conversationMessages,
filter: { "conversationKey" : requestedKey },
options : {sort: {msgTime: -1}},
mappings: [{
//reverse: true,
key: 'conversationKey',
collection: conversationTopics,
filter: { startTime: { $gt : (new Date().getTime() - aLongTimeAgo ) } },
options: {
sort: { createdAt: -1 }
},
}]
});
您可以在没有_id的情况下进行连接吗?
不,不是用压水堆。 使用外键(即另一个表/集合中的 id)连接几乎总是查询关系数据的方式。PWR正在做出这一假设,以降低已经棘手的实施的复杂性。
如何改进此发布?
实际上,这里不需要反应式联接,因为一个查询不依赖于另一个查询的结果。如果每个对话主题都包含一组对话消息 ID,则会发生这种情况。由于可以独立查询这两个集合,因此可以改为返回游标数组:
Meteor.publish('conversations', function(requestedKey) {
check(requestedKey, String);
var aLongTimeAgo = 864000000;
var filter = {startTime: {$gt: new Date().getTime() - aLongTimeAgo}};
return [
conversationMessages.find({conversationKey: requestedKey}),
conversationTopics.find(requestedKey, {filter: filter})
];
});
笔记
在发布函数中进行排序没有用,除非您使用的是
limit
。请务必使用像这样的 PWR 分叉版本,其中包括 Tom 的内存泄漏修复。
与其说
conversationKey
,不如说conversationTopicId
更清楚。
我认为现在使用反应式发布包可以更轻松地解决此问题(我是作者之一)。您现在可以在autorun
内进行任何查询,然后使用该查询的结果发布要推送到客户端的查询。我会给你写一个示例代码,但我真的不明白你到底需要什么。例如,您提到您想限制主题,但您没有解释如果您提供requestedKey
无论如何都是文档的 ID,为什么它们会受到限制?所以只有一个结果可用?
- 在输入字段上使用它-can'我不能从函数中取出变量,这样我就可以使用它了
- 如果我选择不填写字段值或选项集值,则出错
- “最大化”按钮不调整字段集大小
- 变量不从字段收集数据
- Mongodb:不能使用字符串字段名称附加到数组
- 按字段 ID 而不是字段名称复制表单元素
- 为什么Javascript对象不更新字段
- AngularJS$valid不在字段上工作
- Mongodb返回不带字段名的值
- jquery屏蔽了输入插件,错误时不清除字段
- JavaScript提交表单,不包括字段
- 使用动态添加的表单(而不是字段!)进行BootstrapValidator验证
- 正在创建不带字段名的javascript对象
- 我如何用Javascript捕获字段名(不是字段值)
- 使流星渲染保持不变字段
- 如何定义HTML表单元素的默认值而不填充字段
- JavaScript更新的是页面而不是字段
- 在jquery中平衡两个输入数字字段,但不显示字段中的值
- JQuery表单提交不验证字段
- 如何在dijit/layout/TabContainer中轻松禁用不可见字段