2014-06-29 69 views
0

我已經收集了大量以下投票數據投票的列表:過濾多於X找到匹配

{ 
    "user_id" : ObjectId("53ac7bce4eaf6de4d5601c1a"), 
    "article_id" : ObjectId("53ab27504eaf6de4d5601be5"), 
    "score" : 5 
}, 
{ 
    "user_id" : ObjectId("53ac7bce4eaf6de4d5601c1b"), 
    "article_id" : ObjectId("53ab27504eaf6de4d5601be5"), 
    "score" : 3 
}, 
{ 
    "user_id" : ObjectId("53ac7bce4eaf6de4d5601c1c"), 
    "article_id" : ObjectId("53ab27504eaf6de4d5601be5"), 
    "score" : 3 
}, 
... 

我期待過濾此集合,其中超過3票已(如上所述)獲得並按原樣輸出(不包括關於第<條總票數的任何投票條目)。

任何幫助非常感謝。這個集合可以是巨大的,所以效率將是理想的。

+0

你究竟在這裏問什麼?所有文章都有相同的「ID」。那麼你想要單個文件還是每件文章的總數少於三個? –

+0

我想放棄投票的文章總共投票少於3票(3篇文章條目)的投票條目(文檔)(忽略投票分數,只是文檔條目總數 - 總票數)。那有意義嗎? – dolyth

+0

沒有真正回答這個問題。這三份文件都是針對同一篇文章的。 「投票」字段的「總和」是否需要小於3才能顯示文檔或您的意思是什麼?如果你不清楚,我在這裏看到的答案是「投票」:{「$ gt」:3}'除非這基本上是你想要的。但看起來很基本。 –

回答

1

通常不是您在單個操作中執行的操作,但如果這些操作確實是您唯一的字段並且沒有太多匹配的文檔,您可以執行此操作。

db.collection.aggregate([ 
    { "$group": { 
     "_id": "$article_id", 
     "docs": { 
      "$push": { 
       "user_id": "$user_id", 
       "article_id": "$article_id", 
       "score": "$score" 
      } 
     }, 
     "votes": { "$sum": 1 } 
    }}, 
    { "$match": { "votes": { "$gt": 3 } } }, 
    { "$unwind": "$docs" }, 
    { "$project": { 
     "user_id": "$docs.user_id", 
     "article_id": "$docs.article_id", 
     "score": "$docs.score" 
    }} 
]) 

可以清理一下有點用MongoDB的2.6和更高它提供了$$ROOT在管道系統變量:

db.collection.aggregate([ 
    { "$group": { 
     "_id": "$article_id", 
     "docs": { 
      "$push": "$$ROOT" 
     }, 
     "votes": { "$sum": 1 } 
    }}, 
    { "$match": { "votes": { "$gt": 3 } } }, 
    { "$unwind": "$docs" }, 
    { "$project": { 
     "user_id": "$docs.user_id", 
     "article_id": "$docs.article_id", 
     "score": "$docs.score" 
    }} 
]) 

否則你可以接受你是在幾個步驟做這個並處理與返回「article_id的」值列表中的「數」大於三:

var ids = db.collection.aggregate([ 
    { "$group": { 
     "_id": "$article_id", 
     "votes": { "$sum": 1 } 
    }}, 
    { "$match": { "votes": { "$gt": 3 } } }, 
]).toArray().map(function(x){ return x._id }); 

db.collection.find({ "article_id": { "$in": ids } }) 

如果這是一個殼操作,那麼你會使用結果數組中的「結果」鍵在默認情況下在早期版本中返回到2.6。

+0

再次感謝您閱讀您提供的這些答案後,我開始更加了解這一點。只是另一點(如果你會這麼友好:)) - 如果我想確保每個投票文件都是唯一的,是否有辦法做一個複合ID?像ID(user_id,article_id)?從自動插入的ID保存一些空間。 – dolyth

+1

@dolyth絕對。就像你甚至可以如何處理集合文檔上的實際'_id'字段一樣,你可以「合成」集合'$ group'上使用的'_id'值。這是一種常用的方法,因此如果您搜索聚合框架標籤上給出的答案,那麼這裏將會有很多例子。一個非常基本的「所有文檔」的例子是[這裏](http://stackoverflow.com/a/21721480/2313887) –

+0

輝煌!再次感謝您的時間和詳細的幫助。 – dolyth