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

时间:2015-11-21 22:32:00

标签: javascript mongodb meteor

我正在建立一个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字段,对推文进行排序,如果这样的事情存在的话

如果有更好的方法,我不反对重组我的模型。我曾经考虑过每当你转发时都会创建一条新的推文,但问题是每条推文都有likeCountretweetCount。如果我在转发时创建一个全新的推文,并且有人喜欢或推翻转发,那么所有数字都是错误的(或者需要进行荒谬的非规范化更新)。

1 个答案:

答案 0 :(得分:0)

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

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

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