在Meteor(MongoDB)中,按另一个集合中的值搜索一个集合

Searching one collection by a value in another, in Meteor (MongoDB)

本文关键字:集合 一个 搜索 Meteor MongoDB 另一个      更新时间:2023-09-26

我正在构建一个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值对所有推文进行排序。如果我转发了昨天创建的推文,它会出现在我最后一天的推文下方的推文中。

换句话说,我需要一种方法来根据Tweets自己的createdAt字段、根据相关事件的createdAt字段对Tweets进行排序,如果存在这样的事情的话。


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

  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;
  }
});

这将是一种规范化的方法。为了提高性能,并且考虑到tweet很短,您可以将每条tweet中的body字段复制到Events文档中。