有幾種不同的方法可以解決這個問題。我將關注的解決方案使用mongodb的聚合框架。首先,這裏是一個聚合管道,它可以解決你的問題,接下來是對命令中發生的事情的解釋/分解。
db.testagg.aggregate(
{ $unwind : '$likes' },
{ $group : { _id : '$_id', numlikes : { $sum : 1 }}},
{ $sort : { 'numlikes' : 1}})
此管道具有3個主要的命令:
1)放卷:使得存在1 '喜歡' 每個文檔元素
2)組這個分割了 '喜歡' 字段:這使用_id字段重新組合文檔,爲找到的每個文檔遞增numLikes字段。這將導致numLikes被填充一個數字,該數字等於之前「喜歡」的元素的數量
3)Sort:最後,我們按照numLikes的升序對返回值進行排序。在測試我跑這個命令的輸出是:
for (var i=0; i < 100; i++) {
db.testagg.insert({_id : i})
for (var j=0; j < i; j++) {
db.testagg.update({_id : i}, {'$push' : {'likes' : j}})
}
}
請注意,這並不能完全回答你的問題,因爲它避免了採摘的問題:
{"result" : [
{
"_id" : 1,
"numlikes" : 1
},
{
"_id" : 2,
"numlikes" : 2
},
{
"_id" : 3,
"numlikes" : 3
},
{
"_id" : 4,
"numlikes" : 4
}....
這是數據通過插入日期範圍,但它應該讓你開始並朝着正確的方向前進。
當然,還有其他方法可以解決這個問題。一種解決方案可能是僅執行客戶端的所有排序和操作。這只是獲取您想要的信息的一種方法。
編輯:如果你發現這有點乏味,有一個票據添加一個$尺寸的運算符到聚合框架,我邀請你觀看,並可能upvote它試圖加快這個新的運算符,如果你是感興趣。
來源
2012-12-24 18:31:24
ACE
是的,你可以使用[聚合框架](http://docs.mongodb.org/manual/applications/aggregation/)來做這樣的查詢。 – JohnnyHK