【问题标题】:Searching one collection by a value in another, in Meteor (MongoDB)在 Meteor (MongoDB) 中按另一个集合中的值搜索一个集合
【发布时间】:2015-11-23 02:23:04
【问题描述】:

我正在构建一个 Twitter 克隆,但我在排序方面遇到了困难。

这是我的收藏:

Tweets:
  createdAt: Date
  body:      String
  userId:    String

Events:
  createdAt: Date
  type:      String (either 'retweet' or 'like')
  tweetId:   String
  userId:    String

当用户点击“转发”时,它会创建一个新的 Event 文档,用于跟踪推文和用户 ID。

然后,当我查看用户的个人资料页面时,我会搜索所有由该用户撰写的推文,或者存在具有该用户 ID 的“转推”事件的所有推文。我在服务器上进行了响应式连接,以便Tweets 集合拥有所有必要的推文。

问题在于排序:我正在按照createdAt 的值对所有推文进行排序。如果我转发昨天创建的推文,它将显示在我的提要中下方我最后一天自己的任何推文。

换句话说,我需要一种方法来对推文进行排序,或者通过它们自己的createdAt 字段,通过关联事件的createdAt 字段(如果存在这样的事情)。


如果有更好的方法,我不反对重构我的模型。我曾想过每当你“转发”时创建一条新推文,但问题是每条推文都有一个likeCount 和一个retweetCount。如果我在转发时创建一条全新的推文,并且有人喜欢或转发了转发,那么所有数字都会出错(或者需要进行大量的非规范化更新)。

【问题讨论】:

  • 似乎最简单的方法是在推文上添加 tweetedAt 日期字段。否则排序会很慢,因为您需要映射您的推文并使用 Event.createdAt 日期对其进行扩充。
  • 感谢米歇尔的快速回复!不完全确定您的意思;推文在发布推文时已经有一个createdAt 日期字段。问题是给定的推文可能会被转发 1000 次,每次都与特定用户绑定不同的日期。
  • 对不起,我误会了。即使是原版,你也总是有Event 吗?在这种情况下,您可以按事件的createdAt 日期对事件进行排序,然后查找每个事件的推文内容。
  • 就是这样,我不 =(。我想我可以创建一个,只是为了让我的生活更轻松。我将如何按Events 集合对Tweets 集合进行排序,然后? 我可以在客户端.fetch() 他们并使用_.sortBy,但是在服务器上有更好的方法吗?

标签: javascript mongodb meteor


【解决方案1】:
  1. 确保始终为每条推文创建 event
  2. 使用 [reywood:publish-composite]https://atmospherejs.com/reywood/publish-composite) 包发布按Event.createdAt 键排序的Events 集合,并限制为您想要显示的事件数量。
  3. 在您的模板中,使用{{#each events}} 而不是{{each tweets}}
  4. 使用模板助手返回推文正文

助手:

Template.myTemplate.helpers({
  events: function(){
    return Events.find({},{sort: {createdAt: -1}});
  },
  body: function(){
    return Tweets.findOne({ _id: this.tweetId }).body;
  }
});

这将是一种标准化的方法。为了提高性能并且鉴于推文很短,您只需将每条推文中的 body 字段复制到 Events 文档中即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-30
    • 2016-01-25
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    • 2013-12-02
    相关资源
    最近更新 更多