2012-08-28 109 views
1

背景:我有帖子和用戶,都是HABTM社區。在我的崗位模型中,我有一個比較多少社區計算後的相關性給定用戶的方法,他們的共同點是這樣的:虛擬屬性Mongoid查詢數據庫

def relevance(user) 
    (self.communities & user.communities).length 
end 

目的:要查詢的帖子或者通過給定的相關性,即

Post.where(:relevance => 3) 

查詢所有帖子,並通過相關性,即

Post.all.desc(:relevance) 
對它們進行排序

我知道用戶變量需要在那裏,只是想知道這樣的事情是否可能或者是否存在解決方法。

+0

我擔心你無法直接做到這一點。但是你可以使用一些map/reduce處理。 – apneadiving

+0

你可以擴大一點我不確定你想要完成什麼。相關性在哪裏計算?它是否已經存在於文檔中? – Sammaye

+0

相關性是作爲post.rb中的一種方法計算的(參見上面的代碼),因爲它對每個用戶都不相同,必須在運行中進行計算。 – neon

回答

0

您可以使用Aggregation Framework(版本2.2中的新功能)在mongoDB中執行此操作。

你必須有用戶社區的數組可用。在這個例子中,我將它稱爲userComms - 我期待它是一個與posts.communities具有相同類型值的數組。

db.posts.aggregate([ 
    { 
     "$unwind" : "$communities" 
    }, 
    { 
     "$match" : { 
      "communities" : { 
       "$in" : userComms 
      } 
     } 
    }, 
    { 
     "$group" : { 
      "_id" : "$_id", 
      "relevance" : { 
       "$sum" : 1 
      } 
     } 
    }, 
    { 
     "$sort" : { 
      "relevance" : -1 
     } 
    } 
]); 

這將返回形式的文件:

{ 
    "result" : [ 
     { 
      "_id" : 1, 
      "relevance" : 4 
     }, 
     { 
      "_id" : 6, 
      "relevance" : 3 
     }, 
... 
     ] 
} 

結果數組包含帖子的_ids和有關通過加入它們的共同點與用戶社區的數目而計算。然後它按這個總和排序(降序)。

+0

剛開始使用Mongo時,我一直在尋找如何使用Mongoid來實現這個功能 - 雖然我不確定它是否可能。任何建議重新:這樣做瓦特/ Mongoid? – neon

+0

您可以使用db.runCommand({aggregate:「collectionname」,pipeline:[...]})來執行任何聚合框架管道 –

+0

謝謝,我使用這種方法遇到的問題是帖子的相關性與每個用戶。這意味着它需要current_user對象才能進行計算。有關如何做到這一點的任何想法? – neon