2014-02-11 21 views
0

如果我有一個文件,尋找更多或更少的這樣一個集合:的MongoDB讓用戶用最喜歡的職位

{ 
"_id": "52c06c86b78a091f26000001", 
"desc": "Something somethingson", 
"likes": [ 
    { 
     "user_id": "52add4f4344e8ca867000001", 
     "username": "asd", 
     "created": 1390652212592 
    }, 
    { 
     "user_id": "52add4f4344e8ca867000001", 
     "username": "asd", 
     "created": 1390652212592 
    } 
], 
"user_id": "52add4f4344e8ca867000001", 
"username":"username" 
} 

難道我用的MongoDB(使用的NodeJS &快遞)得到10個用戶的列表,最喜歡的帖子?

我想應該可以做到這一點Map-Reduce或與聚合,通過「user_id」分組所有職位,然後計算「喜歡」數組中的項目總數。然後從中獲得前10名「user_id」。

我猜這是可能的。唯一的問題是,我沒有從mongo網站上得到足夠的例子來把我自己的東西放在一起。

任何人都可以告訴我一個這樣做的例子,或者至少告訴我它是不可能的。 =)

+1

你需要看看聚合框架。他們有一個適用於您的用例的非常直接的例子。 http://docs.mongodb.org/manual/tutorial/aggregation-with-user-preference-data/#return-the-five-most-common-likes –

回答

3

嘗試了這一點...

db.collection.aggregate([ 
    {$unwind: "$likes"}, 
    {$group: {_id: "$user_id", likesCount: {$sum: 1}}}, 
    {$sort: {likesCount: -1}}, 
    {$limit: 10}, 
    {$project: {_id: 1}} 
]) 

看到這個tutorial

+0

謝謝你的貢獻。但是,這個網站是爲了幫助人們學習,而不是爲他們做工。 OP可以在不知道發生什麼的情況下複製粘貼,並且沒有任何有價值的東西。 –

+0

該網站幫助人們找到解決方案。如果提問者複製粘貼或逐步分析示例是他/她的決定。這個答案絕對是一個很好的答案。 – heinob

+3

我沒有在這裏做任何人的工作......這是一個例子,充其量。 OP不會從這個簡單的查詢中創建一個帝國。此查詢不是專有的,不屬於我,也不屬於您或OP。 MongoDB創建了供大家使用的查詢引擎。最好的問候, – Rishi

1

,這是可能的:

db.coll.aggregate([ 
    { 
     $unwind: "$likes" 
    }, 
    { 
     $group: { 
      _id: "$user_id", 
      likesPerUser: { 
       $sum:1 
      } 
     } 
    } 
    { 
     $sort: { 
      likesPerUser: -1 
     }; 
    } 
    { 
     $limit: 10 
    } 
]) 
+0

在$ group子句中,user_id:「$ user_id」應替換爲_id:「$ user_id」 – bla

+0

謝謝。更正! – heinob

0

如果你需要計算每父用戶喜好元素的數量,你可以做到以下幾點:

http://mongotry.herokuapp.com/#?bookmarkId=52fb8c604e86f9020071ed71

[ 
{ 
    "$unwind": "$likes" 
}, 
{ 
    "$group": { 
     "_id": "$user_id", 
     "likesPerUser": { 
      "$sum": 1 
     } 
    } 
}, 
{ 
    "$sort": { 
     "likesPerUser": -1 
    } 
}, 
{ 
    "$limit": 10 
} 
] 

否則,如果您需要喜歡的用戶ID號碼,每個子文檔計數爲1,則可以執行以下操作:

http://mongotry.herokuapp.com/#?bookmarkId=52fb8cf74e86f9020071ed72

[ 
{ 
    "$unwind": "$likes" 
}, 
{ 
    "$group": { 
     "_id": "$likes.user_id", 
     "likesPerUser": { 
      "$sum": 1 
     } 
    } 
}, 
{ 
    "$sort": { 
     "likesPerUser": -1 
    } 
}, 
{ 
    "$limit": 1 
} 
]