2015-11-21 71 views
0

我建立一個Twitter克隆,我已經打了一個牆排序。搜索一個集合在其他的值,流星(MongoDB中)

這裏是我的收藏品:

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值排序的所有的鳴叫。如果我轉推是昨天創造了一條Twitter消息,它會在我的下面我自己的微博中的任何飼料在最後一天出現。

換句話說,我需要的方式通過,如果這樣的事情存在關聯的事件的createdAt領域鳴叫或者通過自己的createdAt場,排序。


我不反對重組我的模型,如果有更好的方法來做到這一點。我曾考慮過在創建新的Tweet時,只要你「轉推」,但問題是每個Tweet都有一個likeCount和一個retweetCount。如果我在轉推時創建全新的Tweet,並且某人喜歡或轉發轉發,則所有數字都會出錯(否則將會出現一個荒謬的非規範化更新數量)。

+0

似乎是最簡單的方法是添加上鳴叫了'tweetedAt'日期字段。否則,排序將非常緩慢,因爲您需要映射您的推文並使用'Event.createdAt'日期來擴充它們。 –

+0

感謝Michel的快速回復!雖然不完全確定你的意思,推文推文中已經有'createdAt'日期字段。問題在於,推特可能會重新推送1000次,每次推送的日期都與特定用戶有關。 –

+0

對不起,我誤解了。即使是原創的,你是否總是有一個「事件」?在這種情況下,您可以通過「createdAt」日期排列事件,並查找每個事件的推文內容。 –

回答

0
  1. ,請務必在每個鳴叫
  2. 使用創建一個event的[reywood:發佈複合] https://atmospherejs.com/reywood/publish-composite)封裝發佈Events收集由Event.createdAt鍵排序,並僅限於要然而,許多事件顯示。
  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文檔中。

+0

神奇,作品像一個魅力。謝謝米歇爾! –

相關問題