2012-09-13 49 views

回答

5

是的,它可以使用聚合框架。

假設

查詢

這方法迫使你解除放棄結果並重新評估匹配謂詞與展開結果,所以它的效率真​​的很低。

db.test_col.aggregate(
    {$match: {tags: {$in: ["shirt","cotton","black"]}}}, 
    {$unwind: "$tags"}, 
    {$match: {tags: {$in: ["shirt","cotton","black"]}}}, 
    {$group: { 
     _id:{"_id":1}, 
     matches:{$sum:1} 
    }}, 
    {$sort:{matches:-1}} 
); 

預期結果

{ 
    "result" : [ 
     { 
      "_id" : { 
       "_id" : ObjectId("5051f1786a64bd2c54918b26") 
      }, 
      "matches" : 3 
     }, 
     { 
      "_id" : { 
       "_id" : ObjectId("5051f1726a64bd2c54918b24") 
      }, 
      "matches" : 2 
     }, 
     { 
      "_id" : { 
       "_id" : ObjectId("5051f1756a64bd2c54918b25") 
      }, 
      "matches" : 1 
     } 
    ], 
    "ok" : 1 
} 
+0

效率低下?我提出建議,我需要儘可能快,你認爲這可以以更好的方式完成嗎? – Wiliam

+0

不,沒有更好的方法,使用這個模式來做到這一點。它比MR方法快得多。 請注意,如果您擁有(匹配)多個文檔,則會釋放它在內存中創建的數百萬* avg_tags_size。 聚合框架具有內存使用限制。謹慎使用它。 –

+1

我試過了,我使用的是v2.2,所以我不得不改變「_id:{」_ id「:1}」爲_id:{「_ id」:「$ _ id」}「並刪除了第二個$匹配。它工作得很好,但速度不夠快,謝謝:)(PHP代碼:https://gist.github.com/41d31bccd0cc3814fdda) – Wiliam