使用 Meteor 发布关系包,其中每个联接不能使用 _id 字段

Using Meteor publish-with-relations package where each join cannot use the _id field

本文关键字:不能 字段 id 布关系 Meteor 关系 使用      更新时间:2023-09-26

我正在努力解决一个与以下博客文章中的讨论没有什么不同的问题。这是希望在 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,为什么它们会受到限制?所以只有一个结果可用?