2
問題的數量是下一個:在陣列中的MongoDB的搜索和排序的匹配
Get documents with tags in list, ordered by total number of matches
但是他們說,這是可能的使用聚合框架,這可能嗎?
問題的數量是下一個:在陣列中的MongoDB的搜索和排序的匹配
Get documents with tags in list, ordered by total number of matches
但是他們說,這是可能的使用聚合框架,這可能嗎?
是的,它可以使用聚合框架。
假設
tags
屬性中使用的相同是一組(無重複的元素)查詢
這方法迫使你解除放棄結果並重新評估匹配謂詞與展開結果,所以它的效率真的很低。
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
}
效率低下?我提出建議,我需要儘可能快,你認爲這可以以更好的方式完成嗎? – Wiliam
不,沒有更好的方法,使用這個模式來做到這一點。它比MR方法快得多。 請注意,如果您擁有(匹配)多個文檔,則會釋放它在內存中創建的數百萬* avg_tags_size。 聚合框架具有內存使用限制。謹慎使用它。 –
我試過了,我使用的是v2.2,所以我不得不改變「_id:{」_ id「:1}」爲_id:{「_ id」:「$ _ id」}「並刪除了第二個$匹配。它工作得很好,但速度不夠快,謝謝:)(PHP代碼:https://gist.github.com/41d31bccd0cc3814fdda) – Wiliam