在Meteor(MongoDB)中,按另一个集合中的值搜索一个集合
Searching one collection by a value in another, in Meteor (MongoDB)
我正在构建一个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
。如果我在转发时创建了一个全新的推文,并且有人点赞或转发了该推文,那么所有的数字都是错误的(或者需要大量的非规范化更新)。
- 确保您始终为每条推文创建一个
event
- 使用[reywood:publish composite]https://atmospherejs.com/reywood/publish-composite)包来发布按
Event.createdAt
键排序的Events
集合,并且仅限于要显示的事件数量 - 在模板中,执行
{{#each events}}
而不是{{each tweets}}
- 使用模板助手返回推文正文
助手:
Template.myTemplate.helpers({
events: function(){
return Events.find({},{sort: {createdAt: -1}});
},
body: function(){
return Tweets.findOne({ _id: this.tweetId }).body;
}
});
这将是一种规范化的方法。为了提高性能,并且考虑到tweet很短,您可以将每条tweet中的body
字段复制到Events
文档中。
相关文章:
- Meteor.js只更新一个参数,而不是整个集合
- 如何查找流星集合中最后一个元素/对象的id
- 包含一个集合的1到3个成员但其中一个成员不能单独存在的正则表达式
- 将一个对象集合映射到汇总集合的单个对象
- 如何将两个集合转换为一个集合
- Meteor:访问另一个集合,每个块中有一个id
- 主干-用一个请求替换整个集合
- 如何计算mongodb中两个集合中一个字段的不同值的数量
- 组织一个backbone.js集合
- 如何在集合中指定模型的一个属性
- Backbone.js视图可以有一个模型和一个集合吗
- 另一个集合视图中的集合视图
- 如何使用Angular 2服务提供包含指向另一个资源的链接/ids的资源集合
- Backbone.Collection 获得第一个 n 作为新集合
- Mongo-Aggregate:如何与另一个集合中的字段进行比较
- Meteor - 将 mongodb 查询分配给变量并将其插入到另一个集合
- 在 Backbone.js 中为集合中的一个元素创建详细信息页面
- 基于 MongoDB 中另一个集合中的数据查询一个集合中的数据
- 流星 - 将数据从一个集合移动到另一个集合
- 更改一个对象的可观察属性会更改集合中所有对象的属性